Haskell:将列表分成3元组

时间:2013-05-25 01:42:26

标签: haskell

了解Haskell(Monads等)的基本原理,但尚未使用它 两年来,我一直在苦苦挣扎两个小时干净地做这个小小的运动:

我想将一行3 * n整数(如"1 1 1 2 2 2 3 3 3")转换为Int的3元组列表(如[(1,1,1),(2,2,2),(3,3,3)]中所示。

这应该以一种直接的,错误捕捉的方式完成。

到目前为止,我能想出的最佳解决方案包含以下内容:

groupsOf3 :: [a] -> Maybe [(a,a,a)]
groupsOf3 list =
    let fun l = case l of
            []           -> []
            (x:y:z:rest) -> (Just (x,y,z)) : (fun rest)
            _            -> [Nothing]
    in sequence $ fun list

这对我来说似乎并不优雅。我如何将此功能(具有相同的界面)更多地编写为点?

1 个答案:

答案 0 :(得分:8)

我认为你的解决方案看起来很不错。但是,因为我无法抗拒选择流下的颜色,你也可以考虑这样的事情:

import Control.Applicative
import Control.Monad
groupsOf3 (x:y:z:rest) = ((x,y,z):) <$> groupsOf3 rest
groupsOf3 smallList    = guard (null smallList) >> return []

您还可以考虑使用chunksOf

import Control.Monad
import Data.List.Split
convert [x,y,z] = Just (x,y,z)
convert _ = Nothing
groupsOf3 = sequence . map convert . chunksOf 3