Haskell 命名模式和类型推断?
我正在处理一些示例,在执行bind(>=)时遇到了一个错误,错误是monad:Haskell 命名模式和类型推断?,haskell,Haskell,我正在处理一些示例,在执行bind(>=)时遇到了一个错误,错误是monad: data E a = Success a | Error String instance Monad E where return a = Success a (Success a) >>= f = f a e@(Error s) >>= _ = e 如果不使用命名模式(语法@),则一切正常: (Error s) >>= _ = Er
data E a = Success a
| Error String
instance Monad E where
return a = Success a
(Success a) >>= f = f a
e@(Error s) >>= _ = e
如果不使用命名模式(语法@
),则一切正常:
(Error s) >>= _ = Error s
为什么这两种形式不相等?发生了什么?让我们从查看
错误的类型开始:
Error :: String -> E a
这意味着,对于任何a
类型,您都可以通过使用类似Error“foo”
的方法获得ea
。但是,每个特定的错误“foo”
值都必须选择一个特定的a
,以后不能更改它。因此错误“foo”::E Int
与错误“foo”::E String
不同
因此,在您的具体示例中,e
是指类型为ea
的实际“原始”Error s
值,而在替代公式中,您正在构造一个新的Error s
值,哪种类型的推理强制使用类型eb
提示:RHS的类型与E
的类型不同。
Error :: String -> E a