嵌套数据构造函数的模式匹配

bar*_*kyn -1 haskell pattern-matching algebraic-data-types

对于以下代码,我继续收到编译器错误,因为我正在编写(List _)并且它正在尝试对列表进行模式匹配.我该如何解决这个问题?

data List a = Cons a (List a) | Empty

instance Monad List where
    Empty >>= _ = Empty 
    Cons x (List _) >>= f = f x
Run Code Online (Sandbox Code Playgroud)

Jon*_*rdy 7

data List a = Cons a (List a) | Empty
Run Code Online (Sandbox Code Playgroud)

这定义了类型构造 List具有两个数据构造 ConsEmpty.Cons有两个字段,一个是类型a,另一个是类型List a- 反过来可以是Empty或者是Cons,等等.

所以当你写:

Cons x (List _) >>= f = f x
Run Code Online (Sandbox Code Playgroud)

编译器正在寻找一个名为pattern-match on 的数据构造函数List,并且没有一个 - 因此错误.如果您只想忽略该字段,请写:

Cons x _ >>= f = f x
Run Code Online (Sandbox Code Playgroud)

现在当然这不是一个适当的Monad实例List- 更像是一个Maybe- 但我会让你自己解决这个问题.