在阅读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
答案 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
提供了值,也可以在let
或where
子句,结果相同。与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'
数据类型获取b
和CountMe
的值。它需要使用模式匹配功能来提取此类值。如果您已定义函数来获取此类值,请说
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