Azr*_*iel 3 haskell types type-inference function definition
如果我这样做any isUpper "asBsd",我会得到的True.
这里,第二个元素any是一个字符串.
但是,如果我这样做:
any ("1" `isInfixOf`) ["qas","123","=-0"]
Run Code Online (Sandbox Code Playgroud)
第二个元素any是一个字符串列表.
如何以及为什么这两个功能之间存在差异?
另一个例子.
如果我写filter isUpper "asdVdf",我会得到"V".
这里,要过滤的第二个元素是一个字符串.
但是,如果我这样写:
filter (isUpper . head) ["abc","Vdh","12"]我会得到的["Vdh"].
如您所见,要过滤的第二个元素现在是一个字符串列表.
为什么存在差异以及haskell如何知道它在两种情况下都是正确的?
总结一下:
我不明白在同一个函数中,有一次haskell得到第二个元素是一个字符串,而在其他时候,haskell得到一个字符串列表,在第二个元素中.
有一次它发生在any功能上,另一次发生在filter功能上.
haskell(和我)怎么知道它在两种情况下都是正确的?
谢谢 :-).
ken*_*ytm 11
因为isUpper是一个Char -> Bool功能"1" ‘isInfixOf‘而且isUpper . head是[Char] -> Bool功能
"1" `isInfixOf` xxx
Run Code Online (Sandbox Code Playgroud)
可以改写为
isInfixOf "1" xxx
Run Code Online (Sandbox Code Playgroud)
我们知道的类型isInfixOf是[a] -> [a] -> Bool1.现在第一个参数isInfixOf是"1"类型[Char],所以我们可以推导出a一个Char:
isInfixOf :: [a] -> [a] -> Bool
"1" :: [Char]
//? a = Char and
isInfixOf "1" :: [a] -> Bool
= [Char] -> Bool
Run Code Online (Sandbox Code Playgroud)
这意味着isInfixOf "1"现在是一个[Char] -> Bool功能.
现在,类型any是(a -> Bool) -> [a] -> Bool功能.如上,
any :: (a -> Bool) -> [a] -> Bool
isInfixOf "1" :: ([Char] -> Bool)
//? a = [Char] and
Run Code Online (Sandbox Code Playgroud)
any(isInfixOf"1"):: [a] - > Bool = [[Char]] - > Bool
为了满足类型约束any (isInfixOf "1"),参数必须是字符串列表.
现在考虑isUpper.类型isUpper是Char -> Bool.因此:
any :: (a -> Bool) -> [a] -> Bool
isUpper :: (Char -> Bool)
//? a = Char and
any isUpper :: [a] -> Bool
= [Char] -> Bool
Run Code Online (Sandbox Code Playgroud)
所以只any isUpper需要一个字符串,而不是一个字符串列表.
最后,isUpper . head.在Haskell中,相关函数的类型是:
filter :: (a -> Bool) -> [a] -> [a]
head :: [a] -> a
isUpper :: Char -> Bool
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
因此filter isUpper,a = Char和类型是[Char] -> [Char],即它需要一个字符串作为参数.
和2:
(.) :: (b -> c ) -> (a -> b) -> a -> c
isUpper :: (Char -> Bool)
head :: ([b] -> b)
//? c = Bool, b = Char, a = [b] = [Char], and
isUpper . head :: a -> c
= [Char] -> Bool
Run Code Online (Sandbox Code Playgroud)
因此filter (isUpper . head),我们有a = [Char]和类型[[Char]] -> [[Char]],即它需要一个字符串列表作为参数.
注意:
isInfixOf实际上是(Eq a) => [a] -> [a] -> Bool作为平等必须是有效的类型a,但是这是在我们的分析无关.a为bfor head,但没关系.String实际上只是字符列表,a [Char].所以,如果你愿意,"你好"是简写['h', 'e', 'l', 'l', 'o'].因此,在这两种情况下,你都会得到一些东西,只是一个案例是Char的列表,另一个案例是一个字符串列表(或者如果你愿意的话,列表中的字符列表).