gpt4 book ai didi

arrays - 在 Haskell 中创建数组

转载 作者:行者123 更新时间:2023-12-02 11:53:39 25 4
gpt4 key购买 nike

我可以构造一个数组:

array ((0,0),(10,10)) [((x,y),(x)) | x<-[0..10], y<-[0..10]]

但我无法用函数构造它,甚至不能使用如下简单的函数:

array ((0,0),(10,10)) [((x,y),f(x)) | x<-[0..10], y<-[0..10]]

这有什么问题吗?具体来说,如何将“x”转换为 Realfrac?

编辑 - 没关系,我使用的是function fromIntegral(num) num而不是function (fromIntegral num) num

最佳答案

问题是,当您说 (x*1.5) 时,您会强制 x 为小数 - 例如 Float、Double 或 Rational - 因为(*) 接受两个相同类型的值并返回一个相同类型的值,当然 1.5 是一个小数。

出现问题的原因是您无法创建由 float 索引的数组,只能创建整数、整数元组等。1 您可能想要做的是将xy保留为整数,但将它们转换为小数类型以计算值:

array ((0,0),(10,10)) [((x,y), fromIntegral x * 1.5) | x<-[0..10], y<-[0..10]]

此处,xy 是整数,但 fromIntegral x 是 double 型。2 什么 fromIntegral 的作用是将任何 Integral 类型(如 Int、Int64 或 Integer)转换为任何 Num(在本例中为 Double):

fromIntegral :: (Integral a, Num b) => a -> b

最终结果是一个由 (Integer, Integer) 索引的数组,其值类型为 Double,这可能就是您最初想要的。 :)

1 具体来说,Ix 类型类的任何实例都可以;您可以看到完整列表in the documentation .

2 至于为什么选择 Integer 和 Double 而不是任何其他 Integral 或 Fractional,这是由于 Haskell 的默认机制。基本上,如果您的程序中有不明确的数字类型,则首先尝试使用 Integer,如果这不起作用(例如,因为类型必须是 Fractional,而正如我们所确定的,Integer 不是),则 Double改为尝试。这是相当任意的,但有助于消除歧义,否则歧义会出现在很多愚蠢的地方。

关于arrays - 在 Haskell 中创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com