我读到cons运算符(:)和++运算符可以在Haskell字符串中互换使用。如何才能做到这一点?我不确定我完全理解这意味着什么。
编辑:这是我认为它应该是:
x:xs = [x]++xs
和
[]++list = list
(x:xs)++list = x:(xs++list)
答案 0 :(得分:6)
(:)
是列表类型的构造函数。这是一个规则的特殊情况,我们可以使用中缀构造函数,只要它们以冒号开头:
Prelude> :info []
data [] a = [] | a : [a] -- Defined in `GHC.Types'
就(++)
而言, (:)
是一个简单implemented的函数:
Prelude> :info (++)
(++) :: [a] -> [a] -> [a] -- Defined in `GHC.Base'
infixr 5 ++
正如您所看到的那些类型不同:
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
上面我使用了hoogle(以及在haddock docs中链接的实现)和GHCi的:t
和:info
命令,现在你也可以使用!
答案 1 :(得分:2)
x:xs = [x]++xs
和
[]++list = list
(x:xs)++list = x:(xs++list)