Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 命名模式和类型推断?_Haskell - Fatal编程技术网

Haskell 命名模式和类型推断?

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

我正在处理一些示例,在执行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) >>= _ = 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