[英]Haskell: Want a better way of doing: value == x || value == y ||
我是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 ==
|| x ==
这么多?
预先感谢您的帮助 :)
(如果相关的话:我正在使用Hugs作为解释器。)
在这种情况下,您可以使用Prelude中的elem
:
isDigit x = elem x "0123456789"
(请记住,字符串是字符列表)
或者您可以使用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') : []
然后使用foldr
。 foldr fz
最好描述为一个函数,它的列表和内容替换:
用f
和[]
与z
。
foldr (||) False (map (x ==) "01234")
= x == '0' || x == '1' || x == '2' || x == '3' || x == '4' || False
那里有它。 foldr
是list函数的祖父,因此,这是“最低级别”的方法,无需显式递归。 这是您的词汇表的另外两个拼写:
isDigit x = any (x ==) "0123456789"
isDigit x = or [ x == d | d <- "0123456789" ]
如果我不得不猜测最常见的“惯用”拼写,那么可能是第一个的这种变体:
isDigit = (`elem` "0123456789")
一旦您熟悉Prelude中所有方便的功能,编写这样的代码就是一件轻而易举的事:-)
我没有看到的另一个样式问题是一个函数
if expr then True else False
等同于简单
expr
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.