刚开始学习Haskell并遇到了这个问题.如果我有一个列表理解与条件,如
[x*2 | x<- [1..10], x `mod` 3 ==2]
我明白了
[4,10,16]
正如所料.但是,如果我有
[x**2 | x<- [1..10], x `mod` 3 ==2]
对于mod函数,它的类型变量是不明确的.我认为这是因为x 2将一个整数提升为浮点数,但为什么这会影响条件?在这种情况下,为什么类型不明确?它计算x 2,然后平方根吗?(这似乎非常不可能)它是否以某种方式跟踪生成每个x 2项的x ?
也许这是势在必行的心态,但在内部,我认为执行将是[在python中]
lst=[] for x in range(10): if x%3==2: lst.append(x**2)
有人可以澄清/纠正我的理解吗?
让我们来看看类型mod
和(**)
:
mod :: Integral n => n -> n -> n (**) :: Floating a => a -> a -> a -- hm......
mod
并对(**)
使用的类型设置其他约束.mod
期望一个整数类型(Int
,Integer
),而(**)
期望一个浮动类型(Float
,Double
).由于没有类型的积分和浮点数,GHC放弃了.
相反,使用(^)
:
(^) :: (Integral n, Num a) => a -> n -> a
例如
[x ^ 2 | x <- [1..10], x `mod` 3 == 2]
顺便说一句,如果您尝试为结果提供类型,则可以更轻松地找到这样的错误:
ghci> [x ** 2 | x <- [1..10], x `mod` 3 == 2] :: [Int]:1:4: No instance for (Floating Int) arising from a use of `**' In the expression: x ** 2 ...