Haskell中List类型的尾部通用版本

时间:2015-01-28 21:52:54

标签: haskell fold

使用 foldr 表达 head 非常容易:

head xs = foldr const (error "Empty list") xs

有没有使用构造函数表达 tail 的通用方法? 我已经找到了这个答案(Getting the head and tail of a custom List type Haskell),上面写着" no"。如果这是不可能的,有人可以解释一下原因吗?

2 个答案:

答案 0 :(得分:2)

我假设通过“不使用构造函数”,你的意思是“在[]类型的构造函数上没有模式匹配”。如果这个假设是错误的,那么这个答案可能不是你想要的。


您可以使用Maybe

轻松完成
import Data.Maybe

tail'
    = fromJust    -- Substitute if you want a different error message for empty lists
    . foldl go Nothing
    where
        go Nothing _ = Just []
        go (Just y) x = Just $ y ++ [x]

这不是最有效的解决方案,只是建筑的证明。

同样,您可以使用

实施init
init'
    = fromJust'
    . foldr go Nothing
    where
        go _ Nothing = Just []
        go x (Just y) = Just $ x : y
        fromJust' (Just x) = x
        fromJust' Nothing = error "init': empty list"

答案 1 :(得分:2)

foldr大致将列表转换为类型为

的Church编码
forall b . b -> (a -> b -> b) -> b

基本上,删除所有:[]构造函数,用两个用户提供的值替换它们。

如果你想要头部,那么你可以轻松地做到,正如你所注意到的那样。但是,如果您想要尾部,则必须重新插入已被剥离的:构造函数。例如,@ bheklilr的解决方案必须在go部分使用构造函数。