小编Brr*_*rch的帖子

为什么 monad 类型类中应该存在fail方法?

所以我有这行代码:

[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 操作不同。

所以我的问题是 - 为什么要存在失败方法?

monads haskell pattern-matching do-notation

5
推荐指数
1
解决办法
151
查看次数

Int 可以增加一个双精度值

这段代码似乎在 Java 中工作,违反了我认为我对语言的了解:

int x = 0;
x += 7.4;
Run Code Online (Sandbox Code Playgroud)

x 现在的值为 7。当然,不能只写int x = 7.4,所以这种行为对我来说似乎很奇怪且不一致。

为什么Java的开发者会选择这样的行为?

我被标记为重复的问题实际上是在回答“发生了什么”部分,但不是我的主要问题:基本原理是什么。

java floating-point double int casting

5
推荐指数
1
解决办法
412
查看次数

'try'可以决定程序何时停止

我有这个功能:

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真的破事吗?

haskell halting-problem

2
推荐指数
1
解决办法
172
查看次数