标签: maybe

Haskell中的undefined与Java中的null之间有什么区别?

两者都是类型是所有类型(无人居住)的交集的术语.两者都可以在代码中传递而不会失败,直到有人试图评估它们.我能看到的唯一区别是,在Java中,存在一个漏洞,它允许仅对null一个操作进行评估,这是一个引用相等比较(==) - 而在Haskell undefined中根本不能在不抛出异常的情况下进行评估.这是唯一的区别吗?

编辑

我真正想要解决的问题是,为什么null在Java 中包含这样一个显然很糟糕的决定,以及Haskell如何逃脱它?在我看来,真正的问题是,你可以做一些有用的null,即你可以检查它的NULL的含量.因为您可以这样做,所以在代码中传递空值并使它们表示"无结果"而不是"此程序中存在逻辑错误"已成为标准惯例.而在Haskell中,没有办法检查一个术语是否在没有评估它且程序爆炸的情况下评估到底部,因此它永远不会用这种方式来表示"没有结果".相反,一个人被迫使用类似的东西Maybe.

对不起,如果看起来我用"评价"这个词快速而宽松地玩......我试图在这里进行类比,并且难以准确地说出它.我想这表明这个比喻是不精确的.

java null haskell types maybe

50
推荐指数
2
解决办法
7485
查看次数

为什么在Clojure中使用Maybe/Option并不是那么普遍?

为什么Clojure尽管如此强调功能范式,却不使用Maybe/ Optionmonad来表示可选值?Option在Scala中使用非常普遍,Scala是我经常使用的函数式编程语言.

monads functional-programming clojure option maybe

40
推荐指数
6
解决办法
8908
查看次数

究竟是什么让Option成为Scala中的monad?

我知道monad是什么以及如何使用它们.我不明白的是,是什么Option一个单子?

在Haskell中,monad Maybe是一个monad,因为它是从Monad类中实例化的(它具有至少2个必要的函数return,bind并且实现了类Monad,实际上是monad).

但是在Scala我们有这个:

sealed abstract class Option[+A] extends Product with Serializable { ... }
trait Product extends Any with Equals { ... }
Run Code Online (Sandbox Code Playgroud)

没有任何与monad相关的东西.

如果我在Scala中创建自己的类,默认情况下它是monad吗?为什么不?

monads haskell functional-programming scala maybe

36
推荐指数
3
解决办法
7823
查看次数

在Haskell中使用Maybe类型

我正在尝试在Haskell中使用Maybe类型.我查找了返回Maybe的键值元组.如何访问由Maybe包装的数据?例如,我想将Maybe包含的整数与另一个整数相加.

haskell maybe

34
推荐指数
5
解决办法
3万
查看次数

如何在Haskell中获得Maybe的"价值"

我对Haskell相对较新,并开始阅读"真实世界Haskell".我只是偶然发现了类型或许有一个关于如何从"Just 1"获得实际值的问题.我写了以下代码:

combine a b c = (eliminate a, eliminate b, eliminate c)
                where eliminate (Just a) = a
                      eliminate Nothing = 0
Run Code Online (Sandbox Code Playgroud)

如果我使用,这可以正常工作:

combine (Just 1) Nothing (Just 2)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将1更改为String,则它不起作用.我想我知道为什么:因为Just 1必须回馈一种类型,在这种情况下,是一种类型eliminate.但是我怎么能改变Int至少与弦乐交易呢?(或者可能有各种类型?)

haskell return-value maybe

34
推荐指数
3
解决办法
3万
查看次数

Clojure中的惯用语错误处理

当我戴上我的C帽时,我认为也许惯用的Clojure只做简单的事情并检查返回值.

当我戴上我的Java帽子时(不情愿地,我必须添加),我想我自己,因为Clojure在JVM上运行,自然的方式必须是使用JVM异常.

当我戴上我的功能帽时,我认为必须有某种monadic构造或线程宏可以以可组合的方式处理错误.

那么在Clojure程序中处理错误的惯用方法是什么?

error-handling exception clojure either maybe

29
推荐指数
2
解决办法
6044
查看次数

F#中是否有标准选项工作流程?

在standrd F#库中是否有一个选项(也许)wokflow(monad)?

我发现手工制作实现的打(1,2)这个工作流程的,但我真的不希望引入非标准的,而不是非常信任的代码到我的项目.谷歌和msdn的所有可想象的查询都不知道在哪里可以找到它.

monads workflow f# option maybe

26
推荐指数
2
解决办法
3842
查看次数

从Java访问scala.None

你怎么scala.None能从Java 访问?

最后一行导致编译器死于"类型scala.None不接受参数".

import scala.Option;
import scala.Some;
import scala.None;
final Option<String> object1 = new Some<String>("Hi there");
final Option<String> object2 = new None<String>();
Run Code Online (Sandbox Code Playgroud)

这失败了"无法找到符号构造函数None()":

final Option<String> object2 = new None();
Run Code Online (Sandbox Code Playgroud)

这失败了"无法找到符号变量无":

final Option<String> object2 = None;
Run Code Online (Sandbox Code Playgroud)

在2007年,这曾经工作,但随后Scala改变了.Java编译器给出error: incompatible types:

final Option<String> object2 = scala.None$.MODULE$;
Run Code Online (Sandbox Code Playgroud)

java singleton scala maybe scala-java-interop

26
推荐指数
3
解决办法
7189
查看次数

B计划,或者与Maybe的相反的是>> =?

我们来看两个功能:

f :: a -> Maybe b
g :: b -> Maybe c
Run Code Online (Sandbox Code Playgroud)

该函数>>=将以这样一种方式工作,只有当它不是时f >>= g才会执行.换句话说,它需要两者并成功产生任何结果.gfNothingfg

我正在实现一个解析器,并意识到我的词法分析器会从中获益.那是:

f :: a -> Maybe b
g :: a -> Maybe b

planb :: (a -> Maybe b) -> (a -> Maybe b) -> (a -> Maybe b)
planb f g = \x -> case f x of
                      Nothing -> g x
                      res -> res
Run Code Online (Sandbox Code Playgroud)

这意味着尝试f,如果失败,请尝试g作为备份计划.使用词法分析器意味着尝试将令牌类型与当前输入匹配,如果失败,请尝试匹配另一个令牌类型(最终将为所有令牌类型链接).

搜索Hoogle没有导致任何这样的功能,但对我来说这样的功能似乎在许多地方都很有用!

因此,我的问题是planb,我是否应该使用已存在的变体?如果没有,我是否做了非凡的事情,有更好的方法来达到我想要的目标? …

haskell maybe

17
推荐指数
2
解决办法
851
查看次数

编写此代码的方法较短

Haskell代码中经常出现以下模式.是否有更短的方式来写它?

if pred x
then Just x
else Nothing
Run Code Online (Sandbox Code Playgroud)

haskell if-statement combinators maybe

16
推荐指数
4
解决办法
922
查看次数