igo*_*ark 4 haskell parametric-polymorphism
有没有办法将作为参数传递的函数应用于两种不同的类型?作为一个人为的例子,我可以(Maybe Int, Maybe Bool)用表达式创建一个(Just 3, Just True),但是如果我尝试使这个行为更通用的功能
generic :: (a -> Maybe a) -> (Maybe Int, Maybe Bool)
generic f = (f 3, f True)
Run Code Online (Sandbox Code Playgroud)
所以我可以做类似的事情generic Just,编译器抱怨因为类型变量a是常量.
其用例是将通用函数应用于树结构,其中每个节点按类型进行参数化.
这可以使用rank-2多态性来实现,如下所示:
{-# LANGUAGE Rank2Types #-}
generic :: (forall a. a -> Maybe a) -> (Maybe Int, Maybe Bool)
generic f = (f 3, f True)
Run Code Online (Sandbox Code Playgroud)
通常你需要一些类型类限制(不是因为执行generic需求它,而是因为调用者无法传递适用于所有类型的参数),例如
genericNum :: (forall a. Num a => a -> a) -> (Int, Integer)
genericNum f = (f 3, f 9)
Run Code Online (Sandbox Code Playgroud)