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