2012-06-29 50 views
1

以下是我已複製了例如:我可以寫charName'a'或'A'=「Albert」嗎?

CHARNAME ::字符 - >字符串
CHARNAME 'A'= 「阿爾伯特」
CHARNAME 'B'= 「Broseph」
CHARNAME 'C'= 「絲絲」
CHARNAME X =「未定義尚」

能否進一步修改上述代碼,以類似下面(不會編譯):

CHARNAME ::字符 - >字符串
CHARNAME 'a' 或 'A'= 「阿爾伯特」
CHARNAME 'b' 或 'B'= 「Broseph」
CHARNAME 'C' 或 'C'= 「絲絲」
CHARNAME X或X = 「未定義尚」

爲了得到 「阿爾伯特」 如果CHARNAME 'a' 或CHARNAME 'A' 給出。

請指導如何以最短的方式編寫上述代碼。

+1

+1「Broseph」。 – mergeconflict

回答

5

另一種選擇是:

charName :: Char -> String 
charName ch 
| ch `elem` "aA" = "Albert" 
| ch `elem` "bB" = "Broseph" 
| ch `elem` "cC" = "Cecil" 
| otherwise = "Not defined yet" 
+0

先生,這工作。 – Optimight

3

您可以使用toLowerData.Char和功能組成。一個解決方案是

charName :: Char -> String 
charName = charName' . toLower 
    where 
     charName' 'a' = "Albert" 
     charName' 'b' = "Broseph" 
     charName' 'c' = "Cecil" 
     charName' _ = "Not defined yet" 

此外,對於後一種情況,如果你想返回一個錯誤,你爲什麼不使用undefinederror error_msg

+0

看起來很對我。 – augustss

+0

@augustss先生,請您重新測試並引導。我在嘗試加載時遇到此錯誤:baby.hs:63:26:不在範圍內:'toLower' 失敗,已加載模塊:無。 – Optimight

+0

@Optimight你需要在你的文件開頭加上'import data.Char' –

4

到米哈伊的答案類似,你可以使用一個case語句,它允許您模式匹配,而不需要定義一個額外的功能:

import Data.Char (toLower) 

charName :: Char -> String 
charName c = case toLower c of 
       'a' -> "Albert" 
       'b' -> "Broseph" 
       _ -> "Not defined yet" 
+0

好的替代答案。 – Optimight

2
import Data.List (find) 

charName :: Char -> String 
charName c = maybe "Not defined yet" snd $ find (elem c . fst) 
    [ ("aA", "Arthur") 
    , ("bB", "Broseph") 
    , ("cC", "Cecil") 
    ] 

解釋使用什麼:

  • fstsnd:提取的元組的,分別
  • Data.List.find在第一或第二元件:找到其滿足給定的謂詞
  • maybe的列表的元素:處理Maybe值。 find產生一個Maybe結果,所以你必須處理失敗的情況。在這種情況下,我選擇了字符串「尚未定義」
  • elem:確定給定列表中是否包含某項內容(類似於Landei的答案)。回想一下,String表示爲Char的列表。
  • 功能組合:.中的(elem c . fst)組成了兩個功能。也就是說,它需要它的輸入元組,訪問第一個元素(這是一個String),然後確定c是否是該字符串中的一個字符。函數組合從右向左讀取。
  • $:美元符號是功能應用程序。它主要用於避免父親。有各種StackOverflow答案詳細說明.$的用法。