Arrays 在Haskell中创建数组
我可以用以下方法构造数组:Arrays 在Haskell中创建数组,arrays,haskell,Arrays,Haskell,我可以用以下方法构造数组: array ((0,0),(10,10)) [((x,y),(x)) | x<-[0..10], y<-[0..10]] array((0,0),(10,10))[((x,y),(x))|x索引类型必须属于Ix类。由于可以理解的原因,像Double或Float这样的类型没有实例。但是您尝试用分数数字相乘。您必须将索引转换为适当的类型,((x,y)问题是,当你说(x*1.5)时,你强迫x是一个小数,比如Float、Double或Rational,因为(*)
array ((0,0),(10,10)) [((x,y),(x)) | x<-[0..10], y<-[0..10]]
array((0,0),(10,10))[((x,y),(x))|x索引类型必须属于Ix
类。由于可以理解的原因,像Double
或Float
这样的类型没有实例。但是您尝试用分数
数字相乘。您必须将索引转换为适当的类型,((x,y)问题是,当你说(x*1.5)
时,你强迫x
是一个小数,比如Float、Double或Rational,因为(*)
接受两个相同类型的值并返回相同类型的值,当然1.5是一个小数
出现这个问题的原因是,你不能用浮点数索引数组,只能用整数、整数元组等。1你可能想做的是将x
和y
保留为整数,但将它们转换为小数类型来计算值:
array ((0,0),(10,10)) [((x,y), fromIntegral x * 1.5) | x<-[0..10], y<-[0..10]]
最终结果是一个由(Integer,Integer)
索引的数组,其值的类型为Double,这可能是您首先想要的:
1具体来说,Ix类型类的任何实例都可以;您可以看到完整的列表
2至于为什么选择Integer和Double而不是任何其他整数或分数,这是由于Haskell的默认机制。基本上,如果程序中有一个不明确的数字类型,则首先尝试Integer,如果它不起作用(例如,因为该类型必须是分数,而我们已经确定Integer不是)这是相当随意的,但有助于消除歧义,否则它会出现在许多愚蠢的地方
array ((0,0),(10,10)) [((x,y), fromIntegral x * 1.5) | x<-[0..10], y<-[0..10]]
fromIntegral :: (Integral a, Num b) => a -> b