失败“零”是在简单的“ a->也许是a”示例中不生成任何内容的方法

Evg*_*eny 0 monads haskell

我正在阅读使用绑定运算符的一个示例

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)

Dan*_*ner 6

适当的阅读(\ 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

没有。