我正在阅读使用绑定运算符的一个示例:
Just 5 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1) )
Run Code Online (Sandbox Code Playgroud)
返回Just 6。
我fail对示例的行为及其有用性感到困惑。查看代码时,我认为fail "zero"可能有意思:
然后我意识到,在进行类型内聚之后,一个异常就变成了Nothing(在此处记录)。令我感到困惑的是,没有类型强制执行fail只是程序中的错误。
Prelude> fail "zero" :: Maybe Int
Nothing
Prelude> fail "abc" :: [Int]
[]
Prelude> fail "zero"
*** Exception: user error (zero)
Run Code Online (Sandbox Code Playgroud)
我的问题是关于fail "zero"此示例的有用性。
适当的阅读(\ x -> if (x == 0) then fail "zero" else Just (x + 1) )尝试会成为a -> Maybe a功能的简单案例吗?
(\ x -> if (x == 0) then Nothing else Just (x + 1) )如果仅需要说明,是什么使我们无法使用 a -> Maybe a?
我在下面找到了此版本,这是一种更容易,更简短的方法来掌握相同的示例。
Prelude> g x = if (x == 0) then Nothing else Just (x + 1)
Prelude> Just 0 >>= g
Nothing
Prelude> Just 1 >>= g
Just 2
Run Code Online (Sandbox Code Playgroud)
适当的阅读
(\ x -> if (x == 0) then fail "zero" else Just (x + 1) )尝试会成为a -> Maybe a功能的简单案例吗?
是。
(\ x -> if (x == 0) then Nothing else Just (x + 1) )如果仅需要说明,是什么使我们无法使用a -> Maybe a?
没有。