了解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
这对我来说似乎并不优雅。我如何将此功能(具有相同的界面)更多地编写为点?
答案 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