从ADT创建无限列表

Dil*_*war 6 haskell

在哈斯克尔,

 > 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 ..在列表中列举精品工程.

(是的,这是语法的一个不幸的怪癖...)