以下是我要做的事情:
justExpose :: Maybe a -> a
justExpose (Just x) = x
justExpose Nothing = -- an empty object of type a
有什么想法吗?
答案 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}}的纯代码中完成。