Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在ocaml中加宽类型_Haskell_Ocaml_Monads_Free Monad - Fatal编程技术网

Haskell 在ocaml中加宽类型

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));; 不幸的是,我得到一个错误,告诉

我正试图用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));;
不幸的是,我得到一个错误,告诉我我没有正确地扩大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));;

谢谢你的回答。我仍在努力在我的特定环境中实现你的想法。