haskell中的未定义值

0 haskell undefined

为什么我不能在haskell中使用undefined值?我的意思是以防万一:

>let t = undefinded
>if t == undefined then "undefined" else "not undefined"
Run Code Online (Sandbox Code Playgroud)

抛出*** Exception: Prelude.undefined 我不能以这种方式使用未定义的值吗?

Kap*_*pol 5

这是Prelude的undefined功能实现:

undefined = error "Prelude.undefined"
Run Code Online (Sandbox Code Playgroud)

因此,尝试评估undefined每次都会引发异常.通过比较tundefined,你强制执行这个评估.

注意,undefined指的是永远不会成功完成的计算,而不是指未知值(undefined例如,JavaScript中的含义;不要混淆这两者,它们是不同的东西).

  • @HaskellFun不,如果给定函数可能不会产生结果,你应该使用`Maybe`类型. (6认同)

Pau*_*son 5

也许您是类比推理,认为“未定义”是 OO 语言中空指针或空引用的 Haskell 等价物。不是。在 Haskell 中,未定义的值只是一个等待发生的错误。

如果你想要一个可选值(在其他语言中你会使用空引用的那种东西),那么你想要Maybe。例如,Maybe Int 要么是“Nothing”,要么是“Just 5”。因此,例如“查找”函数具有类型

lookup :: Eq a => a -> [(a, b)] -> Maybe b
Run Code Online (Sandbox Code Playgroud)

这表示它通过匹配键元素(类型“a”)在对列表中查找内容,然后返回对中的第二项(类型“b”)。当然它可能找不到密钥,所以在这种情况下它返回“Nothing”。

lookup "foo" [("foo", 1), ("bar, 2)]     gives      Just 1
lookup "wib" [("foo", 1), ("bar, 2)]     gives      Nothing
Run Code Online (Sandbox Code Playgroud)

要从“也许”中获得结果,您可以使用模式匹配:

case lookup myKey theTable of
   Just result -> putStrLn $ "Found " ++ show result
   Nothing -> putStrLn "Key not found"
Run Code Online (Sandbox Code Playgroud)

您还可以在Data.Maybe 中使用“maybe”和“fromMaybe”函数。如果您绝对确定该值确实存在,那么您也可以使用“fromJust”,但您需要非常确定,即使如此,您也可能应该对 Nothing 有一个明确的案例,以便您可以在以下情况下给出有用的错误消息你错了。

编辑:解释我们为什么这样做

Haskell 不像其他语言那样有空引用的原因是它们本质上是模棱两可的。当任何值可能为“Null”时,您无法确定是否应该检查 Null。因此,在上面的“查找”示例中,返回类型为“Maybe b”使其明确无误,而且如果您忘记检查,那么编译器会告诉您。相反,如果“查找”返回一个可能为空的引用,调用者怎么知道?如果“查找”的参数之一也为空,会发生什么情况。那会是一个错误吗?拥有空引用意味着找出答案的唯一方法是阅读代码或希望它包含在文档中。