Haskell何时会抱怨函数输入错误?

use*_*132 20 haskell types typechecking typeclass type-mismatch

我是一位Haskell新手,试图把我的头放在函数中的类型绑定以及Haskell如何执行它上。例如,即使fst函数的类型为fst :: (a, b) -> a,编译器也不会抱怨该函数fst'。但是编译器抱怨函数的类型绑定elem'

fst' :: (a,a) -> a
fst' s = fst s

elem' :: (Eq a, Eq b) => a -> [b] -> Bool
elem' x xs = elem x xs
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 31

fst具有as类型,fst :: (a, b) -> a因此意味着可以定义一个函数:

fst' :: (a, a) -> a
fst' = fst
Run Code Online (Sandbox Code Playgroud)

您的fst'功能比该功能更具限制性fst。无论你替换一下a你的fst'函数是罚款fst。如果举个例子a ~ Bool,那么您可以fst使用signature进行呼叫fst :: (Bool, Bool) -> Bool。但是由于fst可以处理所有as和b,所以元组的两个元素都可以Bool,所以给定的fst可以处理2元组的第一和第二项所有可能类型的元组,如果这两个绝对可以项具有相同的类型。

后者是正常,在这里您可以定义:

elem' :: (Eq a, Eq b) => a -> [b] -> Bool
elem' = elem
Run Code Online (Sandbox Code Playgroud)

elem有类型elem :: Eq a => a -> [a] -> Bool。由于可以设置和,因此您可以使用该elem'功能创建的签名不是该功能的子集。在那种情况下,您期望,但显然不成立,因为和类型是两种不同的类型,并且在签名中,它们都是s。elema ~ Intb ~ Boolelem :: Int -> [Bool] -> BoolIntBoolelema