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

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)

Wil*_*sem 5

通常,您可以考虑像数学中的函数一样考虑归纳定义.例如,函数的第一行可以如下所示:

" 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)

  • 优秀的答案,非常有说服力,它完全帮助了我.我对学习更多这种编程语言感到很兴奋,如果我们将其与C,Java等PL进行比较,这是一种非常不同的方法.谢谢你,Willem.我可能会再次到处寻求最好的学习和学习!保持摇滚,哥们! (3认同)