具体来说,我想做这样的事情:
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)
作为旁注:[]创建一个列表,而不是一个集合.