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