我正在嘗試創建一個函式,該函式在串列中查找輸入的字符對,該字符對也被輸入。
findc :: Char -> [(Char, Char)] -> Char
findc x list = head[ if null c then x else c| (n,c) <- list, x == n ]
如果在串列中沒有找到與輸入匹配的字母,則該函式旨在回傳輸入的值。上面的代碼不起作用,因為 null 是 c 的無效型別。
以下代碼僅適用于找到字母時:
findc :: Char -> [(Char, Char)] -> Char
findc x list = head[ c| (n,c) <- list, if x == n then c==c else c==x]
> findc 'B' [('A','F'), ('B','G'), ('C','H')]
'G'
但是當找不到時它不起作用,因為它回傳空串列而不是輸入的字符。
如果在串列中找不到字符,我如何回傳輸入的字符?
uj5u.com熱心網友回復:
您的第一個代碼包含正確的想法,但順序錯誤。您可以將 if 運算式放在理解之外:
findc :: Char -> [(Char, Char)] -> Char
findc x list =
let filtered = [ c | (n,c) <- list, x == n ]
in if null filtered then x else head filtered
但是使用模式匹配而不是 if 運算式和nulland更慣用head:
findc :: Char -> [(Char, Char)] -> Char
findc x list =
case [ c | (n,c) <- list, x == n ] of
[] -> x
(y:_) -> y
uj5u.com熱心網友回復:
Prelude 中已經有一個功能可以滿足您的大部分需求:
lookup :: Eq a => a -> [(a, b)] -> Maybe b
有了這個,你所要做的就是呼叫lookup然后區分Just和Nothing情況:
findc :: Eq a => a -> [(a, a)] -> a
findc goal table = case lookup goal table of
Nothing -> goal
Just subst -> subst
但當然還有一個函式可以用默認值打開 Maybe :
fromMaybe :: a -> Maybe a -> a
結合這兩者,我們得到一個簡單的定義:
findc :: Eq a => a -> [(a, a)] -> a
findc goal table = fromMaybe goal (lookup goal table)
如果你愿意,你可以在這里玩一些代碼高爾夫,注意table引數只是findc在最后傳遞到它的實作中,你可以隱含:
findc :: Eq a => a -> [(a, a)] -> a
findc goal = fromMaybe goal . lookup goal
最后,真正墮落的人可能會嘗試消除goal爭論,這是一個有趣的練習,但不會產生非常可讀的結果:
findc :: Eq a => a -> [(a, a)] -> a
findc = liftA2 (.) fromMaybe lookup
uj5u.com熱心網友回復:
您可以使用Data.List.find. 此函式回傳一個Maybe型別,您可以對其進行模式匹配以回傳提供的字符或元組串列中的相應字符。
import Data.List
findc :: Char -> [(Char, Char)] -> Char
findc ch lst =
let match = find ((ch ==) . fst) lst
in
case match of
Nothing -> ch
Just (_, v) -> v
uj5u.com熱心網友回復:
這是執行此操作的另一種方法:
data Result a = Found a | NotFound a deriving Show
lst = [('A','F'), ('B','G'), ('C','H')]
findc :: Char -> [(Char, Char)] -> Result Char
findc x [] = NotFound x
findc x (n:ns)
| x == fst n = Found (snd n)
| otherwise = findc x ns
main = do
print $ findc 'B' lst -- Found 'G'
print $ findc 'D' lst -- NotFound 'D'
我為結果創建了一個新的資料結構,要么Found value要么NotFound value. 這可以防止我們有一個包含 ('B','B') 的串列的問題,即使搜索詞已成功匹配,它也會回傳搜索詞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517138.html
標籤:哈斯克尔
