List 如何为Haskell';s集合生成器符号?
具体来说,我想做如下工作:List 如何为Haskell';s集合生成器符号?,list,haskell,List,Haskell,具体来说,我想做如下工作: myfunc:: [(Integer, Integer)] myfunc = [(x^2 - y^2, 2 * x * y) | x <- [1..], y <- [1.. (x-1)]] 因此,我知道x显然应该是一个整数,我如何继续并让Haskell知道这就是我想要的?这里的问题是^具有类型(Num a,Integral b)=>a->b->a,因此^的第二个参数可以是任何整数类型。因为结果类型是IntegerHaskell知道a是整数,但它对b一无所
myfunc:: [(Integer, Integer)]
myfunc = [(x^2 - y^2, 2 * x * y) | x <- [1..], y <- [1.. (x-1)]]
因此,我知道x显然应该是一个
整数
,我如何继续并让Haskell知道这就是我想要的?这里的问题是^
具有类型(Num a,Integral b)=>a->b->a
,因此^
的第二个参数可以是任何整数类型。因为结果类型是Integer
Haskell知道a
是整数,但它对b
一无所知。由于不知道该做什么,它默认为Integer
,并生成警告。由于在这种情况下这是完全正常的,您可以忽略或禁用警告
但是,如果希望添加类型批注以明确表示希望正确的操作数具有整数类型,则可以这样做:
(x^(2::Integer) - y^(2::Integer), 2 * x * y)
作为旁注:
[]
创建一个列表,而不是一个集合。更具体地说,警告是关于2
,而不是关于x
(或y
)
肯尼特的建议或写为(xx-yy,…)将使警告消失
另外,请注意,这是一个警告-您的系统似乎设置为在程序中提供尽可能多的警告(“-Wall”),这是掌握编译器认为您在做什么的一个好方法。因为这只是一个警告,你可以随意忽略它;它会做你想做的。最好是让人们输入警告出现的原因,以便更好地了解系统。是的,有一个列表。它通常被称为“列表理解”。
(x^(2::Integer) - y^(2::Integer), 2 * x * y)