在这个模式匹配方程中,我可以使用括号使cons运算符比函数应用程序更优先:
tail (_:xs) = xs
但是,如果我尝试写这个,它将是“模式中的解析错误”:
f (g x) = 7
我看到 g x 产生一个值,我们应该直接传递该值 . 或者以这种方式 f g x = g x + 7 我们在 f 定义的主体中使用参数 x 调用 g .
g x
f g x = g x + 7
f
x
g
但是不允许在模式中传递函数调用的原因是什么?
模式匹配是关于解构事物 . 按照“我使用构造函数 A 构建此数据”的思路 . 通过模式匹配,我们可以看到我们提供的值 A .
A
这意味着这意味着构造函数必须是可逆的,我们需要能够根据结果找出构造函数输入 . 现在如果你想用函数调用做同样的事情,你只需要反转一个函数,想象一下 f = const 0 .
f = const 0
听起来你想要的是一种视图模式 . 您可以在此处传递数据,将其提供给函数,然后对结果进行模式匹配 .
{-# LANGUAGE ViewPatterns #-} foo (bar -> Just a) = a
这应该被理解为“将参数提供给 bar ,然后在结果 Maybe 上进行模式匹配” .
bar
Maybe
我们没有传递任何模式 . 我们描述了传递的数据必须如何使相应的等式生效 .
现在,事实证明,对于 g 和 x 的某种组合,每个值的形式为 g x ,因此模式 g x 可以缩写为 x .
2 回答
模式匹配是关于解构事物 . 按照“我使用构造函数
A
构建此数据”的思路 . 通过模式匹配,我们可以看到我们提供的值A
.这意味着这意味着构造函数必须是可逆的,我们需要能够根据结果找出构造函数输入 . 现在如果你想用函数调用做同样的事情,你只需要反转一个函数,想象一下
f = const 0
.听起来你想要的是一种视图模式 . 您可以在此处传递数据,将其提供给函数,然后对结果进行模式匹配 .
这应该被理解为“将参数提供给
bar
,然后在结果Maybe
上进行模式匹配” .我们没有传递任何模式 . 我们描述了传递的数据必须如何使相应的等式生效 .
现在,事实证明,对于
g
和x
的某种组合,每个值的形式为g x
,因此模式g x
可以缩写为x
.