众所周知,OCaml具有参数多态性,这导致了一些限制。Haskell通过其类型类提供了一种特殊的多态性,显然在某些情况下非常方便。同样众所周知,OCaml的模块和函数系统允许创建一种特殊的多态性。例如,可以参考Simon Shine最近的回答(点击这里)。
我的观点是,在Haskell中可以创建派生多个类型类的类型。例如:
我的观点是,在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
的模块。