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] -> Bool
1.现在第一个参数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
为b
for head
,但没关系.String实际上只是字符列表,a [Char]
.所以,如果你愿意,"你好"是简写['h', 'e', 'l', 'l', 'o']
.因此,在这两种情况下,你都会得到一些东西,只是一个案例是Char的列表,另一个案例是一个字符串列表(或者如果你愿意的话,列表中的字符列表).