我不太精通Haskell,所以这可能是一个非常简单的问题。
Rank2Types解决什么语言限制? Haskell中的函数是否已经支持多态参数?
最佳答案
它们确实可以,但是仅排名1。这意味着,尽管您可以编写不带此扩展名但接受不同类型参数的函数,但不能编写在同一调用中将其参数用作不同类型的函数。
例如,如果没有此扩展名,则不能键入以下函数,因为g
的定义中f
与不同的参数类型一起使用:
f g = g 1 + g "lala"
请注意,完全有可能将多态函数作为参数传递给另一个函数。因此,像
map id ["a","b","c"]
这样的东西是完全合法的。但是该函数只能将其用作单态。在示例中,map
使用id
,就好像其类型为String -> String
一样。当然,您也可以传递给定类型的简单单态函数,而不是id
。没有rank2types,函数将无法要求其参数必须是多态函数,因此也无法将其用作多态函数。