haskell和函数的类型定义.几个问题

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.类型isUpperChar -> 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]],即它需要一个字符串列表作为参数.


注意:

  1. 该类型isInfixOf实际上是(Eq a) => [a] -> [a] -> Bool作为平等必须是有效的类型a,但是这是在我们的分析无关.
  2. 我暂时将变量更改abfor head,但没关系.


Mat*_*rog 5

String实际上只是字符列表,a [Char].所以,如果你愿意,"你好"是简写['h', 'e', 'l', 'l', 'o'].因此,在这两种情况下,你都会得到一些东西,只是一个案例是Char的列表,另一个案例是一个字符串列表(或者如果你愿意的话,列表中的字符列表).