gpt4 book ai didi

polymorphism - 使 OCaml 函数对 int 列表和 float 列表具有多态性

转载 作者:行者123 更新时间:2023-12-04 05:02:20 28 4
gpt4 key购买 nike

有没有办法在 OCaml 中创建一个对整数和浮点数同样适用的多态添加函数?因此,例如,如果我有如下功能:
partialsums [1; 2; 3; 4; 5]我应该得到 [1; 3; 6; 10; 15]但此功能不适用于 [1.; 2.; 3.; 4.; 5.]因为在 OCaml 中,整数和浮点数绝对不能混合。但是,如果我希望我的函数同样适用于 int 列表和 float 列表怎么办?是否有一个通用类型,其中 int 和 float 是子类型?如果是这样,它是什么?我对这个有点迷茫。谢谢您的帮助?

最佳答案

编辑:虽然这个答案具有理论值(value),但您想阅读 neo's answer如今。
使用参数多态性,没有。与 ad-hoc polymorphism , 是的。
对于某些类型 t,定义一个模块,

module type Semigroup = sig
type t
val add : t -> t -> t
end
和一些实用功能,如 partialsums在仿函数内部依赖于此,
module Utils (S : Semigroup) = struct
let partialsums xs =
match xs with
| [] -> []
| (x::xs) ->
List.rev (snd (List.fold_left
(fun (acc, ys) x -> let y = S.add acc x in (y, y::ys)) (x, [x]) xs))
end
你可以得到 partialsums专门针对特定类型的 t,
module IntUtils = Utils(struct type t = int
let add = (+) end)
module FloatUtils = Utils(struct type t = float
let add = (+.) end)

let int_test = IntUtils.partialsums [1; 2; 3; 4] ;;
let float_test = FloatUtils.partialsums [1.0; 2.0; 3.0; 4.0]
这有点酷,但也有点乏味;你仍然必须在你的函数前面加上一些特定类型的东西,但至少你只需要编写一次函数。这只是模块系统很棒。
使用模块化隐式,是的,是的,是的!
Modular Implicits (2014) White、Bour 和 Yallop,你可以写,
implicit module Semigroup_int =
type t = int
let add = (+)
end

implicit module Semigroup_float =
type t = float
let add = (+.)
end

implicit module Semigroup_string =
type t = string
let add = (^)
end

let add {S : Semigroup} x y = S.add x y
这将允许定义泛型和重载 partialsums ,
let partialsums xs =
match xs with
| [] -> []
| (x::xs) ->
List.rev (snd (List.fold_left
(fun (acc, ys) x -> let y = add acc x in (y, y::ys)) (x, [x]) xs))
所以现在它对于整数和浮点数同样适用!
let int_test = partialsums [1; 2; 3; 4] ;;
let float_test = partialsums [1.0; 2.0; 3.0; 4.0]
let string_test = partialsums ["a"; "b"; "c"; "d"]
显然,在统一 ML 模块系统和 Haskell 的类型类概念方面已经进行了几次尝试。参见例如 Modular Type Classes (2007)由 Dreyer、Harper 和 Chakravarty 撰写的一个很好的背景故事。

关于polymorphism - 使 OCaml 函数对 int 列表和 float 列表具有多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37694313/

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