如何为Haskell的集合构建器表示法指定类型?

aga*_*gam 3 haskell list

具体来说,我想做这样的事情:

myfunc:: [(Integer, Integer)]
myfunc = [(x^2 - y^2, 2 * x * y) | x <- [1..], y <- [1.. (x-1)]]
Run Code Online (Sandbox Code Playgroud)

当我尝试加载这个时,ghci我得到了

    Warning: Defaulting the following constraint(s) to type `Integer'
         `Integral t' arising from a use of `^' at myfunc.hs:76:20-22
Run Code Online (Sandbox Code Playgroud)

所以我知道x应该显然是一个Integer,我怎么继续让Haskell知道那就是我想要的?

sep*_*p2k 11

这里的问题是^有类型(Num a, Integral b) => a -> b -> a,所以第二个参数^可以是任何整数类型.因为结果类型是IntegerHaskell知道它a是Integer,但它一无所知b.不知道该怎么做,它默认Integer并产生警告.由于在这种情况下这是完全正常的,您可以忽略或禁用警告.

但是,如果您更愿意添加类型注释以明确表示您希望右操作数具有Integer类型,则可以这样执行:

(x^(2::Integer) - y^(2::Integer), 2 * x * y)
Run Code Online (Sandbox Code Playgroud)

作为旁注:[]创建一个列表,而不是一个集合.

  • 是的,列表.它通常被称为"列表理解". (2认同)