Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 从ADT创建无限列表_Haskell - Fatal编程技术网

Haskell 从ADT创建无限列表

Haskell 从ADT创建无限列表,haskell,Haskell,在哈斯克尔 > a = [1,1..] 创建一个无限列表。现在我有以下几点 data Subunit = O | P deriving (Eq, Show) 如果我这样做了 b :: [Subunit] b = take 6 [P,P..] 我得到以下信息: parse error on input ‘]’ 为什么会失败

在哈斯克尔

 > a = [1,1..]
创建一个无限列表。现在我有以下几点

data Subunit = O | P deriving (Eq, Show)           
如果我这样做了

b :: [Subunit]                                                                   
b = take 6 [P,P..]  
我得到以下信息:

 parse error on input ‘]’

为什么会失败?我需要添加什么才能创建一个无限列表?

[n,n'..]
是语法糖,因此您需要将类型作为类型类的实例


您还需要一个值,而不是值构造函数:

或(根据@sepp2k评论):


您可以使用此行生成ADT的无限列表

infiniteSubunit = P:infiniteSubunit
然后你可以按原样使用它

b :: [Subunit]                                                                   
b = take 6 infiniteSubunit

作为behzads答案的替代方案,您可以

b :: [Subunit]
b = take 6 $ repeat P

太-这一个不需要枚举

很好的捕获!事实上,它错了

> take 10 [P, P..]

<interactive>:6:16: parse error on input ‘]’
为什么空白很重要?因为在其他情况下,语法与模块前缀名称重叠,其形式为
module.name
。例如,下面是如何访问
前奏曲
中的操作符

> :t (Prelude..)
(Prelude..) :: (b -> c) -> (a -> b) -> a -> c
> :t succ Prelude.. succ   -- infix use!
succ Prelude.. succ :: Enum c => c -> c
因此,
p..
是模块
p
中的
,而
p..
在列表枚举中工作正常


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

作为另一种选择,若要直接执行看起来像是要执行的操作,请使用

b :: [Subunit]
b = replicate 6 P

“您还需要一个值,而不是一个值构造函数”
[P,P..]
工作正常。空值构造函数是一个值。@sepp2k您是对的。在
之前需要额外的空间。
。如果没有它,
[P,P..]
错误。最好使用
infiniteSubunit=fix(P:)
而不是自己做循环。
> take 10 [P, P ..]   -- one more space
[P,P,P,P,P,P,P,P,P,P]
> :t (Prelude..)
(Prelude..) :: (b -> c) -> (a -> b) -> a -> c
> :t succ Prelude.. succ   -- infix use!
succ Prelude.. succ :: Enum c => c -> c
b :: [Subunit]
b = replicate 6 P