- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Philip Wadler 的论文“Monads for functional programming”有一个函数 eval 的例子,它执行用 Haskell 编写的除法。
这是改编自 Graham Hutton 的“Programming in Haskell”:
data Expr = Val Int | Div Expr Expr
eval :: Expr -> Int
eval (Val n) = n
eval (Div x y) = eval x `div` eval y
我的 Java 等价物是:
abstract class IntegerExpression {
abstract Integer evaluate();
}
class Value extends IntegerExpression {
Integer value;
public Value(Integer x) {
value = x;
}
public Integer evaluate() {
return value;
}
}
class DivisionExpression extends IntegerExpression {
IntegerExpression x, y;
public DivisionExpression(IntegerExpression a, IntegerExpression b) {
x = a;
y = b;
}
public Integer evaluate() {
return x.evaluate() / y.evaluate();
}
}
public class DivisionExample {
public static void main(String[] args) {
IntegerExpression two = new Value(2);
IntegerExpression twenty = new DivisionExpression (new Value(100), new Value(5));
IntegerExpression ten = new DivisionExpression(twenty, new Value(2));
IntegerExpression five = new DivisionExpression(new Value(10), two);
IntegerExpression expr = new DivisionExpression(ten, five);
System.out.println(expr.evaluate());
}
}
这看起来不错,但我如何开发这段代码,以便我可以在 Java 中演示 Try monad(捕捉被零除)?
最佳答案
编辑:在这种情况下解决失败的方法是使用 Maybe Monad
,他在 Java 中的表亲是 Optional
类,其中 Option.of
将是 return
而 flatMap
将是 bind
。另一方面,在 Java 和其他 O.O.在这种情况下,语言有一种常见的模式,称为复合,基本上你的数据类型 Expr
将是一个接口(interface)或抽象类,类型构造函数将是叶子:因此,考虑到所有这些,一个简单的工作示例是:
在 haskell 中:
data Expr = Val Int | Div Expr Expr
eval :: Expr -> Maybe Int
eval (Val n) = Just n
eval (Div x y) = do
v1 <- eval x
v2 <- eval y
if v2 == 0
then Nothing
else return (div v1 v2)
n1 = Val 8
n2 = Val 4
n3 = Val 0
d1 = Div n1 n2
d2 = Div d1 d1
d3 = Div d2 n3
main = do
putStrLn $ show (eval d2)
putStrLn $ show (eval d3)
Java 中的等效方法:
import java.util.Optional;
public interface Expr {
public Optional<Integer> eval();
}
然后叶子实现 Expr:
import java.util.Optional;
public class Val implements Expr{
Optional<Integer> value;
public Val(int value) {
this.value = Optional.of(value);
}
@Override
public Optional<Integer> eval() {
return value;
}
}
然后是递归情况:
import java.util.Optional;
public class Div implements Expr {
Expr expr1;
Expr expr2;
public Div(Expr expr1, Expr expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}
@Override
public Optional<Integer> eval() {
return expr1.eval().flatMap(v1 ->
expr2.eval().flatMap(v2 ->
(v2 == 0) ? Optional.empty() : Optional.of(v1 / v2)
)
);
}
public static void main(String[] args) {
Expr iv1 = new Val(6);
Expr iv2 = new Val(3);
Expr iv3 = new Val(2);
Expr iv4 = new Val(0);
Expr div1 = new Div(iv1, iv2);
Expr div2 = new Div(div1, iv3);
Expr div3 = new Div(div2, iv4);
System.out.println(div2.eval());
System.out.println(div3.eval());
}
}
主要功能输出将是:
Optional[1]
Optional.empty
关于java - 这个 Haskell 函数的 Java 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50967383/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
用作 mergetool for Git 时,vimdiff 中与 kdiff3 的“从 A/B/C 中选择行”等效的是什么? kdiff3 中是否有类似 Ctrl+1/2/3 的快捷方式? 最佳答案
什么是 Javascript 等同于 imgsrc = $("#content div form img").attr('src'); HTML 是
您好,我有一个数据库可以从中选择 IP 位置> 脚本是在 php 中,我正在将它转换为 java,但我不知道什么是 ip2long('127.0.0.1' )); 在 java 中的等价物 最佳答案
我有一个 C# 应用程序,我正试图将其转换为 Java。 C# 应用程序有几个类型为 ushort 的变量。 Java 中是否有等效项? 谢谢 最佳答案 在大小方面最接近的等价物是 char,因为 J
我正在 iOS 中寻找与 .NET 中的脉冲和等待模式相同的多线程模式。本质上,我希望后台线程处于休眠状态,直到设置标志为止,这实际上是将线程“踢”到行动中。 它是 loop+thread.sle
对于某些并发编程,我可以使用 Java 的 CountDownLatch概念。是否有 C++11 的等效项,或者该概念在 C++ 中称为什么? 我想要的是在计数达到零时调用一个函数。 如果还没有,我会
我正在用 Ruby 开发一个 CLI 应用程序,我想允许通过 /etc/appnamerc 的标准配置文件级联在 Unix 中进行配置。 , ~/.appnamerc .但是,该应用程序也意味着在 W
是否有与 JAXB 等效的 PHP?它被证明对 Java 开发非常有用,作为一个 PHP 新手,我想在 PHP 世界中使用 JAXB 提供的相同概念。 最佳答案 我之前也想找同样的东西,但是找不到。所
Python 有一个 urljoin 函数,它接受两个 URL 并智能地连接它们。有没有在c++中提供类似功能的库? urljoin 文档:http://docs.python.org/library
我有一个从另一种语言移植的功能,你能帮我把它变成“pythonic”吗? 这里的函数以“非pythonic”方式移植(这是一个有点人为的例子 - 每个任务都与一个项目相关联或“无”,我们需要一个不同项
我有 2 个相同类型的对象,我想将一种状态浅复制到另一种状态。在 C++ 中,我有很棒的 memcpy。我怎样才能在 C# 中做到这一点? MemberwiseClone() 不够好,因为它创建并返回
有什么方法可以在 CSS 中使用条件语句吗? 最佳答案 我想说 CSS 中最接近“IF”的是媒体查询,例如可用于响应式设计的媒体查询。对于媒体查询,您是在说“如果屏幕宽度在 440 像素到 660 像
我正在尝试在 Swift 的 iTunesU 中从“为 iphone 和 ipad 开发 ios7 应用程序”中复制 Stanford Matchismo 游戏。 第三讲77页slides ,它显示使
这个问题在这里已经有了答案: Store output of subprocess.Popen call in a string [duplicate] (15 个回答) 关闭4年前。 我想从 pyt
这个问题在这里已经有了答案: Is there a 'foreach' function in Python 3? (14 个回答) 关闭1年前。 我正在深入研究 Python,但我有一个关于 for
我想从 Java 中的这个 Kotlin 类访问信息。它是通过 Gradle 库导入的。 密封类: public sealed class Resource private constructor()
SWT 中的 JPanel 有什么等价物? 最佳答案 原始问题要求 SWT 等同于 JLabel。 还有一个 org.eclipse.swt.custom.CLabel . SWT 等价于 JPane
在诸如 postgres 之类的 SQL 数据库中,我们可以创建 SCHEMA,以便我们可以将我们的表作为 schema_name.table_name 引用。 mongodb 中有模式吗?谢谢 最佳
哪个模型是“GBTRegressor”Pyspark 模型的 Python 等效模型? 简要背景:我正在尝试将 pyspark 模型重新创建为 python 模型。现有管道中使用的模型是 GBTReg
我是一名优秀的程序员,十分优秀!