fig*_*sso 2 polymorphism haskell list
我有一个功能:
sum f l1 l2 = (f l1) + (f l2)
Run Code Online (Sandbox Code Playgroud)
使用不同类型的列表调用时如何更正此功能?例如:
sum length [1,2] ['a','b']
也许在答案中充实我的评论.通常的签名可能是诱惑给予的
sum :: Num b => ([a] -> b) -> [a] -> [a] -> b
sum f l1 l2 = f l1 + f l2
Run Code Online (Sandbox Code Playgroud)
这里的问题是两个列表必须具有相同的类型,它必须是函数的输入类型.解决方案是告诉GHC该函数实际上具有更通用的类型forall a. [a] -> b,这意味着我们可以选择多个可能不同的 a实例,并且它们都产生相同的b.
{-# LANGUAGE RankNTypes #-}
sum' :: Num b => (forall a. [a] -> b) -> [c] -> [d] -> b
sum' f l1 l2 = f l1 + f l2
main = print $ sum' length [1,2] ['a','b']
Run Code Online (Sandbox Code Playgroud)