在通过GHC扩展工作的同时,我遇到RankNTypes了Haskell学院,其中有以下示例:
main = print $ rankN (+1)
rankN :: (forall n. Num n => n -> n) -> (Int, Double)
rankN f = (f 1, f 1.0)
Run Code Online (Sandbox Code Playgroud)
该文章提供了另一种类型rankN:
rankN :: forall n. Num n => (n -> n) -> (Int, Double)
Run Code Online (Sandbox Code Playgroud)
对差异的解释是"后一个签名需要从n到n的函数用于某些Num n;前一个签名需要从n到n的函数,每个Num n."
我可以理解,前一种类型需要签名是括号中的或更一般的.我不明白后一个签名只需要一个n -> n"某些Num n" 功能的解释.有人可以详细阐述和澄清吗?你如何"阅读"这个以前的签名,这听起来像它的含义?后者的签名是否相同Num n => (n -> n) -> (Int, Double)而不需要forall?