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
可以处理所有 a
和 b
,所以元组的两个元素都是 Bool
就可以了,所以给定 fst
可以处理元组对于 2 元组的第一个和第二个项目的所有可能类型,如果两个项目具有相同的类型肯定没问题。
后者是不是 ok,这里你定义:
elem' :: (Eq a, Eq b) => a -> [b] -> Bool
elem' = elem
但是 elem
的类型是 elem :: Eq a => a -> [a] -> Bool
。您可以使用 elem'
函数创建的签名不是 elem
函数签名的子集,因为您可以设置 a ~ Int
和 b ~ Bool
。在那种情况下,您期望 elem :: Int -> [Bool] -> Bool
,但显然这不成立,因为 Int
和 Bool
类型是两种不同的类型,并且在 elem
签名中,它们都是a
s.
我是一个 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
可以处理所有 a
和 b
,所以元组的两个元素都是 Bool
就可以了,所以给定 fst
可以处理元组对于 2 元组的第一个和第二个项目的所有可能类型,如果两个项目具有相同的类型肯定没问题。
后者是不是 ok,这里你定义:
elem' :: (Eq a, Eq b) => a -> [b] -> Bool
elem' = elem
但是 elem
的类型是 elem :: Eq a => a -> [a] -> Bool
。您可以使用 elem'
函数创建的签名不是 elem
函数签名的子集,因为您可以设置 a ~ Int
和 b ~ Bool
。在那种情况下,您期望 elem :: Int -> [Bool] -> Bool
,但显然这不成立,因为 Int
和 Bool
类型是两种不同的类型,并且在 elem
签名中,它们都是a
s.