繁体   English   中英

Haskell:希望有更好的方法:value == x || 值== y ||

[英]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"

(请记住,字符串是字符列表)

或者您可以使用isDigitData.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM