我正在学习函数式编程风格。在Don't Fear the Monads中,布莱恩·贝克曼(Brian Beckman)对Monad作了精彩的介绍。他提到Monad与功能的组成有关,以解决复杂性。
Monad包含unit
函数,该函数将类型T转换为放大的类型M(T);给定功能从T到M(U)的Bind函数将类型M(T)转换为另一个类型M(U)。 (U可以是T,但不一定是)。
据我了解,实现monad的语言应进行静态类型检查。否则,在编译过程中将找不到类型错误,并且“复杂性”不受控制。我的理解正确吗?
最佳答案
动态类型语言有很多monad实现:
The Maybe Monad in Ruby
OO Monads and Ruby(站点已关闭,但文章is available in the Internet Archive's Wayback Machine)
Monads in Ruby Part 1: Identity,Monads In Ruby Part 1.5: Identity,Monads in Ruby Part 2: Maybe (then again Maybe not)
Monads in Ruby
Monads on the Cheap I: The Maybe Monad in JavaScript,More Monads on the Cheap: Inlined fromMaybe
Monads in Ruby (with nice syntax!),List Monad in Ruby and Python
Haskell-style monad do-notation for Ruby
一般来说,Church-Turing-Thesis告诉我们,可以用一种语言完成的所有事情也可以用其他每种语言完成。
从上面的示例中可以看出,我(主要)是Ruby程序员。因此,就像在开玩笑一样,我采用了上面的示例之一,并以一种我完全不了解的语言重新实现了该语言,该语言通常被认为不是一种功能非常强大的语言,而且它似乎是唯一的编程语言。在我无法找到Monad教程的星球上。我可以向您介绍……PHP中的Identity Monad:
<?php
class Identity {
protected $val;
public function __construct($val) { $this->val = $val; }
public static function m_return($a) { return new Identity($a); }
public static function m_bind($id_a, $f) { return $f($id_a->val); }
}
var_dump(Identity::m_bind(
Identity::m_return(1), function ($x) {
return Identity::m_return($x+1);
}
));
?>
没有静态类型,没有泛型,没有必要关闭。
现在,如果您实际上要静态检查monad,则需要一个静态类型系统。但这或多或少是一种重言式:如果要静态检查类型,则需要一个静态类型检查器。咄。
关于您的问题:
据我了解,实现monad的语言应进行静态类型检查。否则,在编译过程中将找不到类型错误,并且“复杂性”不受控制。我的理解正确吗?
您是对的,但这与单子无关。一般而言,这仅与静态类型检查有关,并且同样适用于数组,列表甚至无聊的整数。
这里还有一条红线鲱鱼:如果您看一下用C#,Java或C编写的monad实现,它们比上面的PHP示例更长,更复杂。特别是,到处都有大量的类型,因此看起来确实令人印象深刻。但是,丑陋的事实是:C#,Java和C的类型系统实际上并不强大,无法表达
Monad
的类型。特别地,Monad
是等级2的多态类型,但是C#和Java仅支持等级1的多态(他们称其为“泛型”,但这是同一件事),而C甚至不支持。因此,monad实际上不是在C#,Java和C中进行静态类型检查的(例如,这就是LINQ monad理解被定义为模式而不是类型的原因:因为您根本无法在C#中表达类型。 )静态类型系统所做的所有事情都是在没有实际帮助的情况下使实现变得更加复杂。它需要更复杂的类型系统(例如Haskell的系统)才能获得单子的实际类型安全性。
注意:正如@Porges所指出的,我上面写的内容仅适用于通用
monad
类型本身。您当然可以表示任何特定单子的类型,例如List
或Maybe
,但不能表示Monad
本身的类型。这意味着您不能对“ List
IS-A Monad
”这一事实进行类型检查,也不能对在所有Monad
实例上运行的通用操作进行类型检查。(请注意,即使对于Haskell的类型系统,检查
Monad
除了符合monad类型外,还应遵守monad定律,这可能太多了。您可能需要从属类型,甚至可能需要成熟的自动定理证明器)关于functional-programming - 实现Monad的语言是否必须为静态类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/394709/