我获得了以下功能,我必须提供最通用的类型。
\x y -> (==)(map x y)
我的方法在所附图片上。解决方案是不同的
Eq b=> (a->b)->[a]->[b]->Bool
我不知道[b]的来源。
更新:我发现
的类型\x y z -> (==)(map x y) z
与原始功能的类型相同。 因此,基本上,您可以在lambda函数中删除其中一个参数,但是仍然存在,因为我们知道(==)需要2个参数?但是为什么呢?
答案 0 :(得分:4)
简短答案:它源于(==)
的两个操作数应具有相同类型的事实。
让我们导出\x y -> (==) (map x y)
的类型。我们可以查找(==) :: Eq c => c -> c -> Bool
和map :: (a -> b) -> [a] -> [b]
的类型。
由于我们将x :: d
和y :: e
应用于map
,因此意味着:
map :: (a -> b) -> [a] -> [b]
x :: d
y :: e
-----------------------------
d ~ a -> b, e ~ [a]
因此x
的类型为a -> b
,而y
的类型为[a]
。
现在我们知道map x y
的类型为map x y :: [b]
。这是带有(==)
的函数应用程序中的参数。因此,我们可以得出(==) (map x y)
的类型为:
(==) :: Eq c => c -> c -> Bool
map x y :: [b]
----------------------------------
c ~ [b]
因此,自c ~ [b]
以来,这意味着(==) (map x y) :: Eq [b] => [b] -> Bool
的类型,因此\x y -> (==) (map x y)
的类型为\x y -> (==) (map x y) :: Eq [b] => (a -> b) -> [a] -> [b] -> [b]
。
因为它认为:
instance Eq a => Eq [a]
因此,我们可以将类型约束从Eq [b]
更改为Eq b
。
更新:我发现类型
\x y z -> (==)(map x y) z
由于(==) (map x y)
是一个函数,上述内容的确成立,因为它与class template argument deduction相反。