Haskell中只有一个参数的(==)是什么类型

时间:2019-06-18 08:58:56

标签: haskell types

我获得了以下功能,我必须提供最通用的类​​型。

\x y -> (==)(map x y)

我的方法在所附图片上。解决方案是不同的

Eq b=> (a->b)->[a]->[b]->Bool

我不知道[b]的来源。

更新:我发现

的类型
\x y z -> (==)(map x y) z

与原始功能的类型相同。 因此,基本上,您可以在lambda函数中删除其中一个参数,但是仍然存在,因为我们知道(==)需要2个参数?但是为什么呢?

enter image description here

1 个答案:

答案 0 :(得分:4)

简短答案:它源于(==)的两个操作数应具有相同类型的事实。

让我们导出\x y -> (==) (map x y)的类型。我们可以查找(==) :: Eq c => c -> c -> Boolmap :: (a -> b) -> [a] -> [b]的类型。

由于我们将x :: dy :: 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相反。