让:
{-# LANGUAGE RecursiveDo #-}
test :: [a] -> Maybe Int
test [] = Just 0
test (_ : xs) = mdo
unless (i == 0) Nothing -- 1
i <- test xs -- 2
Just i
Run Code Online (Sandbox Code Playgroud)
我正在寻找解释为什么调用 eg 会test "hey"导致无限循环,以及通常如何在处理mfix. 另外,有没有办法在不交换(1)和(2)的顺序的情况下纠正前面的玩具示例?
显然不可空是新的默认值,所以我选择了它。考虑下面的代码:
public class C { }
public static C f()
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
编译器会警告可能返回空引用。但如果我改写:
public static C f()
{
C[] a = new C[10];
return a[0]; // null
}
Run Code Online (Sandbox Code Playgroud)
然后编译器保持沉默。我检查了一下返回的值实际上是null. 这只是推理机的弱点吗?