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