在哈斯克尔,
> a = [1,1..]
Run Code Online (Sandbox Code Playgroud)
创建一个无限的列表.现在我有以下内容
data Subunit = O | P deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
如果我这样做
b :: [Subunit]
b = take 6 [P,P..]
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
parse error on input ‘]’
Run Code Online (Sandbox Code Playgroud)
为什么这会失败?我需要添加什么才能创建无限列表?
chi*_*chi 11
好抓!确实错了......
> take 10 [P, P..]
<interactive>:6:16: parse error on input ‘]’
Run Code Online (Sandbox Code Playgroud)
......但事实并非如此
> take 10 [P, P ..] -- one more space
[P,P,P,P,P,P,P,P,P,P]
Run Code Online (Sandbox Code Playgroud)
为什么空白是重要的?因为否则语法与具有表单的模块前缀名称重叠Module.name.例如,这是访问运营商.的Prelude方式.
> :t (Prelude..)
(Prelude..) :: (b -> c) -> (a -> b) -> a -> c
> :t succ Prelude.. succ -- infix use!
succ Prelude.. succ :: Enum c => c -> c
Run Code Online (Sandbox Code Playgroud)
因此,P..是.从模块P,而P ..在列表中列举精品工程.
(是的,这是语法的一个不幸的怪癖...)