haskell:使用不同类型的列表调用函数

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']

Ale*_*lec 5

也许在答案中充实我的评论.通常的签名可能是诱惑给予的

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)