在Haskell中返回某种类型的空对象

时间:2014-12-24 21:08:55

标签: haskell maybe

以下是我要做的事情:

justExpose :: Maybe a -> a
justExpose (Just x) = x
justExpose Nothing = -- an empty object of type a

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

如果您的类型a中包含幺半群结构,那么您可以使用:

import Data.Monoid

justExpose :: Monoid a => Maybe a -> a
justExpose (Just x) = x
justExpose Nothing = mempty

这方面的一些例子:

λ> let x = Nothing :: Maybe (Sum Int)
λ> justExpose x
Sum {getSum = 0}
λ> justExpose (Just [])
[]

但是你应该注意Maybe类型在很多情况下非常有用。

答案 1 :(得分:4)

您要求的是许多其他语言中的“null”。 Haskell故意不提供这样的东西,因为它不安全。

可以获取编译代码,如下所示:

justExpose :: Maybe a -> a
justExpose (Just x) = x
justExpose Nothing = undefined

但如果你用Nothing调用它,你将得到一个运行时异常,因为顾名思义,该值是未定义的!

更新:有几位人士指出,此功能由Data.Maybe.fromJust提供,您可以通过在hoogle中搜索您的类型签名Maybe a -> a来查找

答案 2 :(得分:4)

Maybe a 标准的“具有空值的类型”。

提取a的方法是执行大小写分割或(更好)使用

fromMaybe :: a -> Maybe a -> a  -- Defined in ‘Data.Maybe’

函数,声明为

fromMaybe :: a -> Maybe a -> a
fromMaybe def optional = 
    case optional of
        Just value -> value
        Nothing    -> def

因此,您只需要import Data.Maybe并使用您选择的相应“空对象”(或任务的域名所需内容)调用fromMaybe

如果域中有许多Maybe a个操作,您也可以将其保留为Maybe,甚至可以开始使用a -> Maybe b monad。这里的问题是你“我怎么......”背后的原因。

答案 3 :(得分:3)

没有某种类型的"空对象"在Haskell(可怕的" null"来自其他各种语言)。这是a necessity for type safety。如果你想要一个"空值"您需要使用Maybe

然而,有一个被称为(" bottom")的东西,在某些方面类似但不是真的相同。每种类型都有作为可能的值。底部以几种方式表现出来:通常是错误或无限循环。例如,以下函数产生底部:

f x = f (x + 1)

此函数永远不会返回,因为它将无限循环,因此它的值为。或者你可以举起error

justExpose :: Maybe a -> a
justExpose Nothing = error "there is Nothing"

但请记住这样的错误无法捕获!* error函数(或类似地,undefined值)只应在您知道它时使用#39; s 不应该发生。 (作为旁注:justExpose模块中已IO模式已提供unsafePerformIO功能。{/ 3}}。

[*]有一些涉及{{1}}的技巧可以用来捕获它,但它不能在没有{{1}}的纯代码中完成。