2013-07-23 50 views
2

我想做的事情在ghci以下,但顯然它不允許我這樣做:定義在Haskell交互shell功能

charName :: Char -> String 
charName 'a' = "Albert" 
charName 'b' = "Broseph" 
charName 'c' = "Cecil" 

我可以做:

let charName 'a' = "Albert" 
let charName 'b' = "Broseph" 
let charName 'c' = "Cecil" 

但仍,因爲沒有charName :: Char -> String,它會失敗以下內容:

charName 'a' 
"*** Exception: <interactive>:38:5-26: Non-exhaustive patterns in function charName 

我該如何解決這個問題起訴?

+1

你的'CHARNAME「a''並不在這裏工作的原因是由於缺少類型簽名不是。相反,你的'charName'的三個定義相互覆蓋;在最後,'charName'只被定義爲''c'',因爲那是最後一次。 – chirlu

+0

@chirlu:我如何在'ghci'中定義一個類型簽名? –

+0

@QiangLi在它和函數之間使用分號,或者更好地使用:{方法與鏈接副本中的方法一樣,但實際上,將文件中的定義彈出並加載它們實際上要容易得多,因爲它們更易於閱讀並在那裏編輯。 – AndrewC

回答

0

您可以使用大括號和分號,而不是空白的規則:

Prelude> let {charName 'a' = "Albert"; charName 'b' = "Broseph"; charName 'c' = "Cecil"} 
Prelude> charName 'a' 
"Albert" 
Prelude> charName 'b' 
"Broseph" 
+0

謝謝。你知道我如何在'ghci'中定義一個類型簽名嗎? –

+1

@QiangLi:用同樣的方法。不要忘記';'後面:'let {charName :: Char - > String; charName'a'= ...' – chirlu