Haskell:想要一個更好的方法:value == x || value == y ||

我是 Haskell

的新手,很抱歉,如果這非常明顯……

我已經做了以下函式(這裡用作例子來詢問多個值== something || value == somethingElse checks)來檢查一個字元是否是一個數字:

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的列表)

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

是的,幾乎每種重複模式都有一種簡潔的方法.以下是如何為此推匯出來的.從字元列表開始(為簡潔起見我只做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 f z最好描述為一個函式,它接受一個列表並替換: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中的所有方便功能,編寫這樣的程式碼是一件快樂的事:-)

翻譯自:https://stackoverflow.com/questions/4294652/haskell-want-a-better-way-of-doing-value-x-value-y