Haskell 在ocaml中加宽类型
我正试图用ocaml编写一个免费的monad库,这是从haskell开始的,但我在实现免费的过程中遇到了一个问题Haskell 在ocaml中加宽类型,haskell,ocaml,monads,free-monad,Haskell,Ocaml,Monads,Free Monad,我正试图用ocaml编写一个免费的monad库,这是从haskell开始的,但我在实现免费的过程中遇到了一个问题 wingfree::Functor g=>(对于所有a.f a->g a)->自由f b->自由g b 自由(纯a)=纯a 提升自由f(自由as)=自由(提升自由as) 这是我的翻译尝试 让rec释放:'b.('bt->'bt)->'am->'am= 乐趣f x->将x与 |返回x->返回x |自由x->Free(T.map(自由f)(fx));; 不幸的是,我得到一个错误,告诉
wingfree::Functor g=>(对于所有a.f a->g a)->自由f b->自由g b
自由(纯a)=纯a
提升自由f(自由as)=自由(提升自由as)
这是我的翻译尝试
让rec释放:'b.('bt->'bt)->'am->'am=
乐趣f x->将x与
|返回x->返回x
|自由x->Free(T.map(自由f)(fx));;
不幸的是,我得到一个错误,告诉我我没有正确地扩大g的类型
错误:此定义的类型为('bmt->'bmt)->'bm->'bm
这比“a”更不一般。('at->'at)->'bm->'bm
如果我不插入函数类型注释,一切都正常,但是正如错误消息所说,我没有得到f的常规类型。
问题在哪里?如何扩展f的类型?我对Ocaml不是很熟悉,但我相信
让rec释放:'b.('bt->'bt)->'am->'am=
被解析为
让rec释放:'b。((('bt->'bt)->'am->'am)=
而不是
让rec自由:('b.('bt->'bt))->'am->'am=
前者是基本多态型,后者是rank2型,比欣德利·米尔纳更需要类型系统的支持
IIRC,要实现后者,需要定义自定义包装器数据类型。例如:
type poly={polyf:'a.'a->'a};;
设foo(x:poly):int=x.polyf4;;
let bar:poly={polyf=funx->x};;
让u=print_string(“hello”^string_of_int(foo bar));;
谢谢你的回答。我仍在努力在我的特定环境中实现你的想法。