Fra*_*nte 2 haskell functional-programming tuples list
我正在学习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
Run Code Online (Sandbox Code Playgroud)
我已经做了两个单独的问题(删除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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
通常,您可以考虑像数学中的函数一样考虑归纳定义.例如,函数的第一行可以如下所示:
" 的ex3空列表,以及任何元件是包含空列表和零元组 "
ex3 [] _ = ([], 0)
Run Code Online (Sandbox Code Playgroud)
对于非空列表,当然问题有点困难.就像你的代码一样,这里基本上有两种情况.
" 的ex3一个非空列表和元件的z其中列表的头部是不等于z是一样ex3的的尾列表的,但与该列表的头部前置",所以我们可以写出它喜欢:
ex3 [] _ = ([], 0)
ex3 (x:xs) z | x /= z = (x:t, n)
| otherwise = ...
where (t, n) = ex3 xs z
Run Code Online (Sandbox Code Playgroud)
所以在这里我们ex3使用列表的尾部进行递归调用xs,然后我们获得结果元组(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
Run Code Online (Sandbox Code Playgroud)
然后我们获得预期的结果:
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)
Run Code Online (Sandbox Code Playgroud)