【问题标题】:Explicitly stating a type in list comprehension that uses List.zip在使用 List.zip 的列表推导中明确说明一种类型
【发布时间】:2015-01-09 16:33:43
【问题描述】:

我有以下列表理解

member this.a l1 = 
        let res = [for x, y in List.zip l1 this.l2 do if y > 0 then yield (x |> double)/(y |> double) else yield 0.]

我得到了错误

类型 '(float -> float)' 不支持 'comparison' 约束。例如,它不支持“System.IComparable” 界面

这个表达式的类型应该是 float -> float 但是 这里有 int 类型

y > 0 表达式处。

有没有办法让编译器知道xy 是某种类型,或者l1l2 是同一类型?

编辑:
我实际上拥有的是一个类中的a,已更新以反映这一事实。

【问题讨论】:

  • 如果 l1 和 l2 都是 int 列表,您的代码对我来说编译得很好。您能说明一下您的代码中如何声明 l1 和 l2 吗?
  • 如果我将l1l2 变量设置为int list,您的sn-p 在我的F# 交互式窗口中工作。 (Also, here in dotnetfiddle)
  • 从错误来看,l2 实际上是函数列表float -> float,而不是整数列表。
  • 碰巧,在那一行之后,你在like this 做些什么吗?
  • 假设@Lee 是错误的(我不认为他是...),您可以像这样指定类型:[for (y:int) in 1..10 -> y]。不过,这是追踪错误的好方法。

标签: f#


【解决方案1】:

无论何时创建命名值,都可以像这样指定类型:y:int。例如:[for y:int in 1..10 -> y]

正如 cmets 中所述,我认为这不会解决您的问题,但它可能会帮助您缩小源头的责任范围。一个可能的罪魁祸首是您对l2 的定义。我猜你正在使用一个带有多个参数的函数来定义它,但未能提供足够的参数,导致float->float 类型的函数而不是float

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多