gpt4 book ai didi

arrays - 函数中的 Haskell 数组模式

转载 作者:行者123 更新时间:2023-12-02 07:07:45 28 4
gpt4 key购买 nike

嗨,Haskell 初学者:数组函数中的模式是什么样的?例如:我只想将 +1 添加到数组中的第一个元素

> a = array (1,10) ((1,1) : [(i,( i * 2)) | i <- [2..10]])

我的第一个想法是:

> arraytest :: Array (Int,Int) Int -> Array (Int,Int) Int
> arraytest (array (mn,mx) (a,b):xs) = (array (mn,mx) (a,b+1):xs)

我希望你理解我的问题:)

最佳答案

您无法对数组进行模式匹配,因为 the data declaration in the Data.Array.IArray module for the Array type没有暴露任何数据构造函数。这是 Haskell 中的常见做法,因为它允许作者更新其数据类型的内部表示,而无需对其模块的用户进行重大更改。

使用 Array 的唯一方法因此,就是使用模块提供的功能。要访问数组中的第一个值,可以使用bounds的组合。和(!) ,或者从 assocs 中获取第一个键/值对。然后你可以使用(//)对数组进行更新。

arraytest arr = arr // [(index, value + 1)]
where
index = fst (bounds arr)
value = arr ! index

如果您选择使用assocs ,您可以对其结果进行模式匹配:

arraytest arr = arr // [(index, value + 1)]
where
(index, value) = head (assocs arr) -- `head` will crash if the array is empty

或者您可以使用 Functor列表和元组的实例:

arraytest arr = arr // take 1 (fmap (fmap (+1)) (assocs arr))

不过,您可能很快就会注意到 array包缺少很多方便的功能。与用其他语言实现该操作的方式相比,上述所有解决方案都相当冗长。

为了解决这个问题,我们有 lens 包(及其同类),它为 Haskell 添加了大量便利功能,并制作了类似 array 的包。更容易忍受。这个包的学习曲线相当陡峭,但它的使用非常普遍,绝对值得学习。

import Control.Lens

arraytest arr = arr & ix (fst (bounds arr)) +~ 1

如果你眯起眼睛,你几乎可以看到上面写着arr[0] += 1 ,但我们仍然没有牺牲任何不变性的好处。

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

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