Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell &引用;fromJust";vs.“;Just=";在哈斯克尔_Haskell_Maybe - Fatal编程技术网

Haskell &引用;fromJust";vs.“;Just=";在哈斯克尔

Haskell &引用;fromJust";vs.“;Just=";在哈斯克尔,haskell,maybe,Haskell,Maybe,哈斯克尔是个新手。我试图理解Haskell的图库中的示例。具体来说,有一行是这样的: Just t=其中属于可能(树a) 我不明白这是怎么回事。我知道我们需要从中获取值,可能。我将那行代码替换为 t=fromJust 它的工作原理是一样的。这两行之间有什么区别吗?有人能解释第一行在做什么吗?当您非常确定可能类型将返回只是值时,您可以只进行模式匹配并提取值 例如: Just t=Just 3将把值3赋值为t。您可以在ghci中加载此文件,并自行验证fromJust是相同的,但它更像是一个函数应用程

哈斯克尔是个新手。我试图理解Haskell的
库中的示例。具体来说,有一行是这样的:

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