gpt4 book ai didi

Haskell:想要更好的做事方式:value == x ||值 == y ||

转载 作者:行者123 更新时间:2023-12-03 15:05:52 24 4
gpt4 key购买 nike

我是Haskell的新手,如果这非常明显,我很抱歉......

我制作了以下函数(此处用作询问多个 value==something || value==somethingElse 检查的示例)来检查字符是否为数字:

isDigit :: Char -> Bool
isDigit x =
if
x == '0'
|| x == '1'
|| x == '2'
|| x == '3'
|| x == '4'
|| x == '5'
|| x == '6'
|| x == '7'
|| x == '8'
|| x == '9'
then True
else False

当然,尽管必须有一种简洁的方法来编写像上面这样的函数,所以你不必重复 || x ==这么多?

预先感谢您的帮助 :)

(如果相关:我使用 Hugs 作为翻译。)

最佳答案

在这种情况下,您可以使用 Prelude 中的 elem:

isDigit x = elem x "0123456789"

(记住字符串是 Char 的列表)

或者您可以使用 isDigit 中的 Data.Char :-)

是的,有一种简洁的方法可以编写几乎所有重复的模式。这是如何为这个派生它的。从字符列表开始(为简洁起见,我将只做 0-4)
"01234"

映射比较:
map (x ==) "01234"
= [x == '0', x == '1', x == '2', x == '3', x == '4']
= (x == '0') : (x == '1') : (x == '2') : (x == '3') : (x == '4') : []

然后使用 foldrfoldr f z 最好被描述为一个函数,它接受一个列表并将 : 替换为 f[] 替换为 z
foldr (||) False (map (x ==) "01234")
= x == '0' || x == '1' || x == '2' || x == '3' || x == '4' || False

你有它。 foldr 是列表函数的祖父,因此这是无需显式递归的“最低级别”方法。以下是您的词汇表的另外两个拼写:
isDigit x = any (x ==) "0123456789"
isDigit x = or [ x == d | d <- "0123456789" ]

如果我不得不猜测最常见的“惯用”拼写,它可能是第一个拼写的变体:
isDigit = (`elem` "0123456789")

一旦您熟悉了 Prelude 中的所有便捷功能,编写这样的代码就是一件轻而易举的事 :-)

关于Haskell:想要更好的做事方式:value == x ||值 == y ||,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4294652/

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