gpt4 book ai didi

functional-programming - Ocaml 中的高阶类型构造函数和仿函数

转载 作者:行者123 更新时间:2023-12-03 01:15:22 25 4
gpt4 key购买 nike

以下函数可以多态吗

let id x = x;;
let compose f g x = f (g x);;
let rec fix f = f (fix f);; (*laziness aside*)

是为类型/类型构造函数还是模块/仿函数编写的?我试过了

type 'x id = Id of 'x;;
type 'f 'g 'x compose = Compose of ('f ('g 'x));;
type 'f fix = Fix of ('f (Fix 'f));;

对于类型,但它不起作用。

这是类型的 Haskell 版本:

data Id x = Id x
data Compose f g x = Compose (f (g x))
data Fix f = Fix (f (Fix f))

-- examples:
l = Compose [Just 'a'] :: Compose [] Maybe Char

type Natural = Fix Maybe -- natural numbers are fixpoint of Maybe
n = Fix (Just (Fix (Just (Fix Nothing)))) :: Natural -- n is 2

-- up to isomorphism composition of identity and f is f:
iso :: Compose Id f x -> f x
iso (Compose (Id a)) = a

最佳答案

Haskell 允许更高种类的类型变量。 ML 方言(包括 Caml)仅允许类型为“*”的变量。翻译成简单的英语,

  • 在 Haskell 中,类型变量 g 可以对应于“类型构造函数”,例如 MaybeIO 或列表。因此,如果例如 gMaybe,则 Haskell 示例中的 g x 就可以(行话:“well-kinded”) x整数

  • 在 ML 中,类型变量 'g 只能对应于“基本类型”,例如 intstring,而绝不能对应到诸如 optionlist 之类的类型构造函数。因此,尝试将一个类型变量应用于另一个类型永远都是不正确的。

据我所知,机器学习中的这种限制没有深层次的原因。最可能的解释是历史偶然性。当米尔纳最初提出他关于多态性的想法时,他使用非常简单的类型变量,仅代表类型 * 的单型。 Haskell 的早期版本也做了同样的事情,然后在某个时候 Mark Jones 发现推断类型变量的种类实际上非常容易。 Haskell 很快被修改为允许更高种类的类型变量,但 ML 从未 catch 。

INRIA 的人员对 ML 进行了许多其他更改,但我有点惊讶他们从未进行过这一更改。当我用机器学习编程时,我可能喜欢拥有更高种类的类型变量。但它们不在那里,而且我不知道有什么方法可以对您正在讨论的示例进行编码,除非使用 functors .

关于functional-programming - Ocaml 中的高阶类型构造函数和仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1986374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com