2013-07-23 40 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