3 generics f# types functional-programming language-design
今天在F#中遇到这个问题:
let test<'a> (f: 'a -> unit) =
let x = f 123
let y = f "wow"
()
Run Code Online (Sandbox Code Playgroud)
这会产生编译器错误,因为通用参数在每次调用test <'a>时必须相同,如下所述: 类型推断在传递map函数时不起作用
虽然这是有道理的,但是如果有任何其他语言已经实现了这样的东西 - 这可能是一种"参数级别的泛型",这让我很好奇吗?
作为后续行动,实施这样的事情面临的挑战是什么?
当然.在Haskell中,这类事物被称为"更高等级类型":它们是允许"在括号内移动量化"的类型:
test :: (forall a. a -> ()) -> ()
test f = let x = f 123
y = f "wow"
in ()
Run Code Online (Sandbox Code Playgroud)
"挑战"也在给出的链接中描述:
Rank-N类型重建通常是不可判定的,并且在它们存在时需要一些显式类型注释.
但是,只有排名2类型是可判定的,AFAIK(见这里).这就是为什么在GHC中有两个不同的标志来启用它们.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |