所以我從 Learn you a haskell 開始,在第 4 章找到了不明白的例子作者撰寫了一個函式來從名字和姓氏中提取首字母
initials :: String -> String -> String
initials firstname lastname = [f] ". " [l] "."
where (f:_) = firstname
(l:_) = lastname
這里的意思是什么……她正在將 f 的串列與句點以及 l 和句點的串列結合起來……她如何使用輔助函式?她是否采用了 (f:_) = firstname 因為 f 是 firstname 的第一個字母?在兩個單詞上使用 head 函式不是更簡單嗎?
uj5u.com熱心網友回復:
寫同樣的東西更容易理解的方式是
initials firstname lastname = case (firstname, lastname) of
(f:_, l:_) -> [f] ". " [l] "."
原始代碼中沒有輔助函式,只有輔助變數 f, l :: Char。
實際上,寫這個的首選方式是甚至不引入firstnameand lastname,而只是簡單地對它們進行模式匹配:
initials (f:_) (l:_) = [f] ". " [l] "."
還要注意,我們仍然需要處理任一串列為空的情況。
initials fn [] = ...?
initials [] ln = ...?
uj5u.com熱心網友回復:
是的,使用head函式更簡單:
initials :: String -> String -> String
initials firstname lastname = [head firstname] ". " [head lastname] "."
但是[head x] == take 1 x當它作業時,而head 空輸入的錯誤和take 1不,在這種情況下只回傳一個空串列。所以最好在take 1這里使用:
initials :: String -> String -> String
initials firstname lastname = take 1 firstname ". " take 1 lastname "."
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/367049.html
