在Haskell中没有解构的变体上的模式匹配

fou*_*nes 2 haskell pattern-matching

在下面的代码中,函数disp通过解构来定义Sum b c,然后立即重建它.问题是,我不需要bc,只有一个事实,即它的类型Sum.

data Expr = Name String | Sum Expr Expr
    deriving(Show)

disp (Sum (Name a) (Sum b c)) = a ++ ":" ++ disp (Sum b c)
Run Code Online (Sandbox Code Playgroud)

disp没有这种解构的方式没有这种解构 - 重建(bc绑定),或者这是编写这样一个函数的正确方法?

Fra*_*ser 14

disp (Sum (Name a) s@(Sum _ _)) = a ++ ":" ++ disp s

@ 允许多个匹配同一件事

  • 如果你想匹配而不知道构造函数参数的数量,你可以使用`s @ Sum {}`. (9认同)