Haskell 什么时候抱怨函数输入不正确?

When does Haskell complain about incorrect typing in functions?

我是一个 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

fst 的类型为 fst :: (a, b) -> a 所以这意味着可以定义一个函数:

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

您的 fst' 函数 fst 函数 更具限制性。无论您将 fst' 函数中的 a 替换为什么都适用于 fst。例如,如果 a ~ Bool 成立,则您使用签名 fst :: (Bool, Bool) -> Bool 调用 fst。但是由于 fst 可以处理所有 ab,所以元组的两个元素都是 Bool 就可以了,所以给定 fst 可以处理元组对于 2 元组的第一个和第二个项目的所有可能类型,如果两个项目具有相同的类型肯定没问题。

后者是不是 ok,这里你定义:

elem' :: (Eq a, Eq b) => a -> [b] -> Bool
elem' = elem

但是 elem 的类型是 elem :: Eq a => a -> [a] -> Bool。您可以使用 elem' 函数创建的签名不是 elem 函数签名的子集,因为您可以设置 a ~ Intb ~ Bool。在那种情况下,您期望 elem :: Int -> [Bool] -> Bool,但显然这不成立,因为 IntBool 类型是两种不同的类型,并且在 elem 签名中,它们都是as.