类似于列表的自定义数据构造函数的模式匹配

bud*_*pet 1 haskell pattern-matching

我有一个如下定义的数据构造函数:

data Stack a = Empty | NonEmpty a (Stack a)
         deriving (Show, Read, Eq)
Run Code Online (Sandbox Code Playgroud)

然后我有一个将其与模式匹配一​​起使用的函数:

func :: Stack a -> a
func (Stack.NonEmpty val Stack.Empty) = ...
func (Stack.NonEmpty val1 (Stack.NonEmpty val2 Stack.Empty)) = ...
Run Code Online (Sandbox Code Playgroud)

我想做的是使用类似序列或列表的操作符进行模式匹配,如下所示:

func :: Stack a -> a
func (val :> Stack.Empty) = ...
func (val1 :> val2 :> Stack.Empty) = ...
Run Code Online (Sandbox Code Playgroud)

我知道它实际上不是一个运算符,而是一个数据构造函数,看起来像一个运算符,但我无法使其工作。

几周前我也开始学习 Haskell。

Wil*_*sem 5

您可以定义:>为数据构造函数而不是NonEmpty

data Stack a = Empty | a :> Stack a
    deriving (Show, Read, Eq)
Run Code Online (Sandbox Code Playgroud)

那么您仍然需要做的唯一一件事就是将其指定为右关联运算符,以便x :> y :> z解析为x :> (y :> z)

data Stack a = Empty | a :> Stack a
    deriving (Show, Read, Eq)

infixr 7 :>
Run Code Online (Sandbox Code Playgroud)

这是7固定性并确定如果有两个运算符则优先考虑的内容