Haskell的书让语法混乱(参数重新分配)

时间:2018-12-04 14:48:35

标签: haskell

在阅读Haskell书时,我遇到了以下示例,该示例出现在示例的第4行中,// You can also specify a custom validator. It should return an Error // object if the validation fails. Don't `console.warn` or throw, as this // won't work inside `oneOfType`. customProp: function(props, propName, componentName) { if (!/matchme/.test(props[propName])) { return new Error( 'Invalid prop `' + propName + '` supplied to' + ' `' + componentName + '`. Validation failed.' ); } } 的结果存储在{{1 }}和f a我认为是初始绑定定义中b值的副本。我以前没有看过这种let子句,是我上面的假设中是对的还是其他情况。另外,这是let子句的常用用法,似乎很令人困惑?

CountMe

2 个答案:

答案 0 :(得分:4)

如果这样写,可能更容易理解:

instance Monad CountMe where
  return = pure
  CountMe n a >>= f = case f a of
      CountMe n' b -> CountMe (n + n') b

这种f a与模式CountMe n' b的模式匹配,为变量n'b提供了值,也可以在letwhere子句,结果相同。与case的主要区别在于,后者也可以有多种不同的情况,但是在这种情况下,只有一个构造函数,因此只需要匹配一种情况。

答案 1 :(得分:3)

如果您在Control.Monad中引用了>>=的定义。您会发现f的类型是:

(a -> CountMe b)

因此,假设:

  

f a的结果存储在CountMe的b参数中。

错误f a的结果是CountMe n' b

和下一个假设:

  

我假设n'是初始绑定定义中n值的副本。

也是错误n'的值不是n的副本,n'的值取决于函数f的作用。

您可能已经知道,let子句的常用用法是存储试图在in子句中重复应用的中间结果。这是一个示例:

let m = mean xs in (m^2, m*2)

此处令人困惑的是,由于无法直接从n'数据类型获取bCountMe的值。它需要使用模式匹配功能来提取此类值。如果您已定义函数来获取此类值,请说

getCountMe_N (CountMe n b) = n
getCountMe_B (CountMe n b) = b

let子句可以重写为:

let cntMe = f a in CountMe (n + getCountMe_N cntMe) (getCountMe_B cntMe)

模式匹配不仅限于在let子句中使用,实际上,它通常在函数的参数,where子句和case表达式中使用,有关更多信息,请参见: Pattern matching