gpt4 book ai didi

列表到元组计数值重复和元组内的列表 - Haskell

转载 作者:行者123 更新时间:2023-12-02 06:48:57 25 4
gpt4 key购买 nike

我正在使用 Haskell 学习函数式编程,我有这个练习,我有类似 [a], z 的东西,[a] 任何类型的列表和 z 我要在 [a] 中删除的元素。这个问题很容易解决(即使对于像我这样的 Haskell 新手也是如此)但是我在打印输出的方式上遇到了麻烦。

我需要创建一个元组,其中第一个元素是没有任何z 元素的列表以及它找到z 的次数在 a 中。几个例子:

  • 输入:[2,3,4,2,2] 2
  • 输出:([3,4],3)

  • 输入:[1,1,1,1] 1

  • 输出:([],4)

  • 输入:[1,2,3,4] 5

  • 输出:([1,2,3,4],0)

到目前为止,我已经做了类似的事情,但我不知道如何继续:

ex3 :: (Eq a, Num a) => [a] -> a -> ([a],Int)
ex3 [] _ = ([],0)
ex3 (x:xs) z | x == z = (xs,1) -- this line is wrong, but idk how to fix it
| otherwise = ([0],0) -- same here

我已经分别完成了这两个问题(删除 z 元素并计算 z[a] 中的次数。看起来像这样:

a) 删除 z 元素:

ex3a :: (Eq a) => [a] -> a -> [a]
ex3a [] _ = []
ex3a (x:xs) z | x == z = ex3a xs z
| otherwise = x : ex3a xs z

b) 计算 z[a] 中的次数:

ex3b :: (Eq a) => [a] -> a -> Int
ex3b [] _ = 0
ex3b (x:xs) z | x == z = 1 + ex3b xs z
| otherwise = ex3b xs z

最佳答案

通常,像在数学中您考虑归纳定义 那样来思考函数会有所帮助。例如,函数的第一行可以这样读:

一个空列表的ex3,任何元素都是一个包含空列表和零的元组

ex3 [] _ = ([], 0)

当然,对于非空列表,问题会更难一些。就像在您的代码中一样,这里基本上有两种情况。

"非空列表的ex3和列表头部的元素z等于z 与列表 尾部 ex3 相同,但前面加上该列表的头部”,所以我们可以这样写:

ex3 [] _ = ([], 0)
ex3 (x:xs) z | x /= z = (x:t, n)
| otherwise = ...
where (t, n) = ex3 xs z

所以这里我们用列表的尾部xs递归调用ex3,得到结果元组(t, n),所以 t 包含“删除”的尾部,n 是我们删除元素的次数,如果 x/= z,那么我们可以返回 (x:t, n),因为删除的次数不会改变,但我们必须将 x 添加到列表中。

"一个非空列表的ex3和一个元素z,其中列表的头部等于z与列表尾部 ex3 相同,但计数增加了”,所以:

ex3 :: (Eq a, Num n) => [a] -> a -> ([a], n)
ex3 [] _ = ([], 0)
ex3 (x:xs) z | x /= z = (x:t, n)
| otherwise = (t, n+1)
where (t, n) = ex3 xs z

然后我们得到了预期的结果:

Prelude> ex3 [2,3,4,2,2] 2
([3,4],3)
Prelude> ex3 [1,1,1,1] 1
([],4)
Prelude> ex3 [1,2,3,4] 5
([1,2,3,4],0)

关于列表到元组计数值重复和元组内的列表 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49926594/

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