Haskell &引用;fromJust";vs.“;Just=";在哈斯克尔
哈斯克尔是个新手。我试图理解Haskell的Haskell &引用;fromJust";vs.“;Just=";在哈斯克尔,haskell,maybe,Haskell,Maybe,哈斯克尔是个新手。我试图理解Haskell的图库中的示例。具体来说,有一行是这样的: Just t=其中属于可能(树a) 我不明白这是怎么回事。我知道我们需要从中获取值,可能。我将那行代码替换为 t=fromJust 它的工作原理是一样的。这两行之间有什么区别吗?有人能解释第一行在做什么吗?当您非常确定可能类型将返回只是值时,您可以只进行模式匹配并提取值 例如: Just t=Just 3将把值3赋值为t。您可以在ghci中加载此文件,并自行验证fromJust是相同的,但它更像是一个函数应用程
图库中的示例。具体来说,有一行是这样的:
Just t=
其中
属于可能(树a)
我不明白这是怎么回事。我知道我们需要从中获取值,可能
。我将那行代码替换为
t=fromJust
它的工作原理是一样的。这两行之间有什么区别吗?有人能解释第一行在做什么吗?当您非常确定可能类型将返回只是值时,您可以只进行模式匹配并提取值
例如:
Just t=Just 3
将把值3赋值为t
。您可以在ghci
中加载此文件,并自行验证<代码>fromJust
是相同的,但它更像是一个函数应用程序。fromJust
相当于:
fromJust :: Maybe a -> a
fromJust (Just t) = t
注意,这是一样的!如果您确定您的可能将成为只是而不是什么都不是,那么您可以使用fromJust
来获取其值,而无需进行模式匹配,但在大多数情况下,匹配更干净,因此您不需要在此处使用它。尽管两种形式都有相同的用途
如果出现意外错误,模式匹配表单将为您提供错误位置的更好线索。(fromJust错误异常是从fromJust内部引发的,而失败的模式匹配将为您提供不完整代码的文件、行和列)
$ghci
序曲>:m+数据。可能
前奏曲数据。也许>让t=从无到有
序曲数据。可能>t
***例外:也许吧
前奏曲数据。也许>让t=Nothing
序曲数据。可能>t
***异常::7:5-20:模式数据的无可辩驳模式失败。可能。只是t
边注:考虑使用<代码> fMAP>代码>而不是<代码> > < <代码> >或>代码> t=…这两种语义之间没有细微差别:当<代码>…>代码> <代码>没有< /代码>,<代码>只是t=…会给指向该模式的行给您一个错误;code>t=fromJust…
将给您一个错误,其中一行指向fromJust
的实现。不同之处在于在表达式链中使用fromJust
非常方便。正如Daniel所说:模式匹配方法使程序因无用的而死亡与带有源代码位置的有用错误消息。避免来自Just
。重复说明:当有疑问时,假设你不确定可能会是Just
。另外,在本例中,匹配更干净的一个原因是,它使您跳过一个案例变得更明显。GHC甚至可以通过标记-fwarn complete patterns
来警告您,如果您使用fromJust
,则不会发生这种情况。
$ ghci
Prelude> :m +Data.Maybe
Prelude Data.Maybe> let t = fromJust Nothing
Prelude Data.Maybe> t
*** Exception: Maybe.fromJust: Nothing
Prelude Data.Maybe> let Just t = Nothing
Prelude Data.Maybe> t
*** Exception: <interactive>:7:5-20: Irrefutable pattern failed for pattern Data.Maybe.Just t