gpt4 book ai didi

list - Haskell - 使用 toUpper 将列表 [String] 中的所有字母大写

转载 作者:行者123 更新时间:2023-12-03 23:17:20 25 4
gpt4 key购买 nike

我有一个列表 [String] 任务是删除列表中的那些具有“q”或“p”的元素,然后用 toUpper 将列表中的所有字母大写。

我尝试过的内容如下:

delAndUpper :: [String] -> [String]
delAndUpper myList = filter (\x -> not('p' `elem` x || 'q' `elem` x)) myList

它从列表中正确删除了不需要的元素,但是我不能在这个列表上应用 toUpper,因为 toUpper 的类型是 Char。

我用 map 试过了,它不起作用。
delAndUpper myList = map toUpper (filter (\x -> not('p' `elem` x || 'q' `elem` x)) myList)

我知道,这行代码中的 toUpper 获取一个列表作为值,因此它无法工作,但知道如何向下进入列表并将映射应用到Upper。

请你帮助我好吗。

提前致谢!

你好

最佳答案

映射更深一层

您需要使用 map (map toUpper) .

这是因为您有 [String]而不是 String .

toUpper           :: Char -> Char
map toUpper :: [Char] -> [Char]

IE。
map toUpper       :: String -> String
map (map toUpper) :: [String] -> [String]
map toUpper通过使每个字母大写来将字符串大写,因此 map (map toUpper)将字符串列表中的每个字符串大写。

你的功能变成
delAndUpper myList = map (map toUpper) (filter (\x -> not('p' `elem` x || 'q' `elem` x)) myList)

dave4420 做了一个 good suggestion那个 (map.map) toUpper是一种简洁的写作方式 map (map toUpper)这可以帮助您非常简单自然地思考两个列表级别 - 也可以看看他的答案。

我们可以取消对 p 和 q 的硬接线吗?

您问是否有更短的方法来编写条件,并且不喜欢硬编码 `q``p` .我同意那些多重 `elem`位不漂亮。让我们传入不允许的字母列表并整理一下:
delAndUpper omit strings = map (map toUpper) (filter ok strings) where
ok xs = not (any (`elem` omit) xs)

这里 (`elem` omit)检查一个字符是否在会导致我们省略单词的列表中,所以 (any (`elem` omit) xs)检查 xs 中是否有任何字符被禁止。当然,如果没有被禁止,那就是 ok .

您的原创 delAndUpper现在是 delAndUpper "pq" ,或者如果您还想禁止大写 P 和 Q, delAndUpper "pqPQ" . (稍后会详细介绍。)

我们可以让它更简洁吗?

看看能不能写 ok短一点。我的第一个想法是使用 pointfree在它上面(有关如何让它在 ghci 中运行的详细信息,请参阅 my answer to another question),但它似乎挂了,所以使用一些标准的转换技巧,我们可以编写 not用一个函数接受两个参数,然后通过做 (not.).f 给我们一个 Bool而不是 not.f就像我们在第一次输入后给我们一个 Bool 的函数一样。 any正在服用 (`elem` omit)作为它的第一个参数。这给了我们
ok xs = ((not.).any) (`elem` omit) xs

我们可以从中删除尾随的 xs:
ok = ((not.).any) (`elem` omit) 

和内联:
delAndUpper omit strings = map (map toUpper) (filter (((not.).any) (`elem` omit)) strings)

我不喜欢尾随 strings任何一个:
delAndUpper omit = map (map toUpper).filter (((not.).any) (`elem` omit))

(我们也可以摆脱 omit 论点并完全免费,但这对我来说在难以阅读的道路上走得太远了。)

去哪儿问?
> delAndUpper "pq" $ words "The Queen has probably never had a parking ticket."
["THE","QUEEN","HAS","NEVER","HAD","A","TICKET."]

这是必需的行为吗?小心地排除小写变体然后将所有内容都设为大写似乎很奇怪。我们可以反过来做:
upperAndDel omit = filter (((not.).any) (`elem` omit)).map (map toUpper)

给予
> upperAndDel "PQ" $ words "The Queen has probably never had a parking ticket."
["THE","HAS","NEVER","HAD","A","TICKET."]

关于list - Haskell - 使用 toUpper 将列表 [String] 中的所有字母大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16404435/

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