使用 foldr 表达 head 非常容易:
head xs = foldr const (error "Empty list") xs
有没有使用构造函数表达 tail 的通用方法? 我已经找到了这个答案(Getting the head and tail of a custom List type Haskell),上面写着" no"。如果这是不可能的,有人可以解释一下原因吗?
答案 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
大致将列表转换为类型为
forall b . b -> (a -> b -> b) -> b
基本上,删除所有:
和[]
构造函数,用两个用户提供的值替换它们。
如果你想要头部,那么你可以轻松地做到,正如你所注意到的那样。但是,如果您想要尾部,则必须重新插入已被剥离的:
构造函数。例如,@ bheklilr的解决方案必须在go
部分使用构造函数。