3

我读到 cons 运算符 (:) 和 ++ 运算符可以在 Haskell 字符串中互换使用。如何才能做到这一点?我不确定我是否完全理解这意味着什么。

编辑:这就是我认为应该是的:

x:xs = [x]++xs

[]++list = list

(x:xs)++list = x:(xs++list)
4

2 回答 2

6

(:)是列表类型的构造函数。这是一个规则的特例,我们可以有中缀构造函数,只要它们以冒号开头:

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 文档中链接的实现)和带有:tand:info命令的 GHCi,现在你也可以了!

于 2013-10-19T19:24:08.220 回答
2
x:xs = [x]++xs

[]++list = list

(x:xs)++list = x:(xs++list)
于 2013-10-19T19:19:33.347 回答