所以我有这行代码:
[Nothing] >>= \(Just x) -> [x]
Run Code Online (Sandbox Code Playgroud)
这当然会产生异常,因为该模式与 Nothing 不匹配。
另一方面,这段代码给出了不同的结果,[]:
do
Just x <- [Nothing]
return x
Run Code Online (Sandbox Code Playgroud)
在我看来,它们应该产生相同的结果,因为 do 块应该被脱糖为使用 (>>=) 并返回。但事实并非如此,这使得 do 符号成为一种功能而不是语法糖。
我知道 monad 类型类中存在失败,并且我知道当 do 块中的模式匹配失败时会调用它,但我无法理解为什么它是一种需要的行为,应该与使用正常的 monad 操作不同。
所以我的问题是 - 为什么要存在失败方法?
这段代码似乎在 Java 中工作,违反了我认为我对语言的了解:
int x = 0;
x += 7.4;
Run Code Online (Sandbox Code Playgroud)
x 现在的值为 7。当然,不能只写int x = 7.4,所以这种行为对我来说似乎很奇怪且不一致。
为什么Java的开发者会选择这样的行为?
我被标记为重复的问题实际上是在回答“发生了什么”部分,但不是我的主要问题:基本原理是什么。
我有这个功能:
isUndefined :: () -> Bool
isUndefined x = case unsafePerformIO $ (try (return $! x) :: IO (Either SomeException ())) of
Left _ -> True
Right _ -> False
Run Code Online (Sandbox Code Playgroud)
然后:
isUndefined () = False
isUndefined undefined = True
Run Code Online (Sandbox Code Playgroud)
解决停止问题.当然,这也可以扩展到其他类型.
我的问题:这怎么可能?难道Control.Exception.try真的破事吗?