gpt4 book ai didi

haskell - OCaml 仿函数、Haskell 类型类和多重派生

转载 作者:行者123 更新时间:2023-12-03 23:47:27 24 4
gpt4 key购买 nike

众所周知,OCaml 具有参数多态性,这导致了一些限制。 Haskell 通过其类型类提供了一种特殊的多态性,这显然在多种情况下非常方便。众所周知,OCaml 的模块和仿函数系统允许创建一种特殊的多态性。查看 Simon Shine 最近的精彩回答 here例如。

我的观点是在 Haskell 中可以创建 的类型。派生几个类型类 .例如 :

data Person = Person { firstName :: String
, lastName :: String
, age :: Int
} deriving (Eq, Show, Read)

这对于定义具有多个特性的类型非常方便(允许 Person 类型的值支持相等测试、可打印和在给定示例中可读)。

我的问题如下:我们可以简单地在 OCaml 中做同样的事情吗?简单地说,我的意思是语言的基本语法,没有很多技巧。

举一个具体的例子,假设我们有两个 OCaml 签名
module type Showable = sig
type t
val to_string : t -> string
end

module type Readable = sig
type t
val from_string : string -> t
end

目的是写一个仿函数 F由实现 Showable 的模块参数化和 Readable .

最佳答案

当然,这实际上很容易,使用模块包含。

module type S = sig
include Showable
include Readable with type t := t (* destructive substitution *)
end

module F ( M : S ) = struct
let fake_id x = M.from_string @@ M.to_string x
end

手册中解释了破坏性替换: http://caml.inria.fr/pub/docs/manual-ocaml/extn.html#sec234
其余的是常规模块的东西(完整的解释见手册)

一些仿函数重的库非常依赖这种结构子类型。例如, ocamlgraph 中的每个仿函数定义自己的模块类型参数。这是 Kruskal module 的示例.仿函数期望 Kruskal.G 类型的模块,它实现了 Sig.G 的子签名(由大多数图形模块实现)。

关于haskell - OCaml 仿函数、Haskell 类型类和多重派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799280/

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