【问题标题】:Splitting list into odd and even (Haskell)将列表拆分为奇数和偶数(Haskell)
【发布时间】:2021-09-30 20:51:34
【问题描述】:

我需要创建一个函数,它将获取一个整数列表并将它们分成 2 个列表,一个是奇数,另一个是偶数

split :: [a] -> ([a], [a])
split = undefined

上面是功能基线,下面是我目前的尝试

 split :: [a] -> ([a], [a])
 split [] = ([],[])
 split (x:xs) | x mod 2 == 0 = ([],[x:split xs])
         | x mod 2 /= 0 = ([x:split xs],[])
         | otherwise = ([],[])

【问题讨论】:

  • 您确定需要检查列表元素值的奇偶性,而不仅仅是它们的位置吗?我的意思是,在后一种情况下,您还可以在签名允许的情况下运行split [True, False]split "hello"。此外,您的签名不允许检查 x `mod` 2,因为这对非整数 x 毫无意义。
  • 提示:split (x:xs) 将采用(x:ys, zs)(ys, x:zs) 的形式,其中(ys, zs)split xs 的结果。您需要在 Haskell 中将其写出来,并弄清楚您如何决定使用这两种情况中的哪一种。

标签: list haskell split mod


【解决方案1】:

显式递归:

split :: Integral a => [a] -> ([a], [a])
split []        = ([], [])
split (x:xs)
  | even x      = (x:ys, zs)
  | otherwise   = (ys, x:zs)
  where
    (ys, zs) = split xs

隐式递归:

splitf :: Integral a => [a] -> ([a], [a])
splitf xs = foldr (\x (ys, zs) -> if even x then (x:ys, zs) else (ys, x:zs)) 
                  ([], []) xs

您可以将其简化为无点样式:

splitf2 :: Integral a => [a] -> ([a], [a])
splitf2 = foldr (\x (ys, zs) -> if even x then (x:ys, zs) else (ys, x:zs)) 
                ([], [])

我认为代码是不言自明的。如果有什么需要我进一步解释的,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多