gpt4 book ai didi

ocaml - 我可以在 OCaml 函数中普遍量化 lambda 参数吗?

转载 作者:行者123 更新时间:2023-12-02 15:50:25 24 4
gpt4 key购买 nike

我注意到我无法在 OCaml 中执行以下操作:

# let foo (f : 'a -> unit) = f 1; f "s";;
Error: This expression has type string but an expression was expected of type
int

在 Haskell 中,这可以通过使用 Rank2Types 普遍量化输入函数 f 来解决:

{-# LANGUAGE Rank2Types #-}

foo :: (forall a. a -> ()) -> ()
foo f = let a = f 1 in f "2"

我怎样才能在 OCaml 中获得类似的曝光?

最佳答案

OCaml 仅支持半显式高阶多态:多态函数参数必须装箱在具有多态字段的记录中:

type id = { id: 'a. 'a -> 'a }
let id = { id=(fun x -> x) }
let f {id} = id 1, id "one"

或在对象内部

let id' = object method id: 'a. 'a -> 'a = fun x -> x end
let f (o: <id:'a. 'a -> 'a>) = o#id 1, o#id "one"

除了语法繁重之外,这种多态函数的显式装箱还有一个优点,即它可以很好地与类型推断配合使用,同时仍然只需要在记录类型或方法的定义中进行注释。

关于ocaml - 我可以在 OCaml 函数中普遍量化 lambda 参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72723229/

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