gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:45:43 25 4
gpt4 key购买 nike

如果我执行any isUpper "asBsd",我会得到True
这里,any 的第二个元素是一个字符串。
但是,如果我这样做:

any ("1" `isInfixOf`) ["qas","123","=-0"]

any 的第二个元素是字符串列表。
这两个函数之间如何以及为何存在这种差异?

另一个例子。
如果我写 filter isUpper "asdVdf" ,我会得到 "V"
这里,要过滤的第二个元素是一个字符串。
但是,如果我这样写:
filter (isUpper . head) ["abc","Vdh","12"] ,我会得到["Vdh"]
如您所见,要过滤的第二个元素现在是字符串列表。
为什么存在差异以及 haskell 如何知道这两种情况都是正确的?

总结一下:
我不明白如何在同一个函数中,一次 haskell 获取第二个字符串元素,而另一次,haskell 在第二个元素中获取字符串列表。
一次发生在 any 函数中,另一次发生在 filter 函数中。
haskell(和我)如何知道这两种情况都是正确的?

谢谢:-)。

最佳答案

因为isUpperChar -> Bool功能和"1" ‘isInfixOf‘isUpper . head[Char] -> Bool功能

<小时/>
"1" `isInfixOf` xxx

可以重写为

isInfixOf "1" xxx

我们知道 isInfixOf 的类型是 [a] -> [a] -> Bool 1。现在是 isInfixOf 的第一个参数是 "1"其类型为 [Char] ,所以我们可以推导出aChar :

     isInfixOf :: [a]    -> [a] -> Bool
"1" :: [Char]
//∴ a = Char and
isInfixOf "1" :: [a] -> Bool
= [Char] -> Bool

这意味着isInfixOf "1"现在是[Char] -> Bool功能。

现在,any 的类型是 (a -> Bool) -> [a] -> Bool功能。如上所述,

               any :: (a      -> Bool) -> [a] -> Bool
isInfixOf "1" :: ([Char] -> Bool)
//∴ a = [Char] and

any (isInfixOf "1")::[a] -> Bool = [[Char]] -> bool

为了满足 any (isInfixOf "1") 的类型约束,参数必须是字符串列表。

<小时/>

现在考虑isUpperisUpper的类型是 Char -> Bool 。因此:

              any :: (a    -> Bool) -> [a] -> Bool
isUpper :: (Char -> Bool)
//∴ a = Char and
any isUpper :: [a] -> Bool
= [Char] -> Bool

所以any isUpper只需要一个字符串,而不是一个字符串列表。

<小时/>

最后,isUpper . head 。在Haskell中,相关函数的类型有:

 filter :: (a -> Bool) -> [a] -> [a]
head :: [a] -> a
isUpper :: Char -> Bool
(.) :: (b -> c) -> (a -> b) -> a -> c

因此对于 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

因此对于 filter (isUpper . head) ,我们有a = [Char]类型为[[Char]] -> [[Char]] ,即它需要接受一个字符串列表作为参数。

<小时/>

注意:

  1. isInfixOf 的类型实际上是(Eq a) => [a] -> [a] -> Bool因为等式必须对于类型 a 有效,但这与我们的分析无关。
  2. 我暂时更改了变量 ab对于 head ,不过没关系。

关于haskell 和函数的类型定义。有几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2317399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com