2017-06-13 75 views
0

我有以下功能:如何讓它更安全?

isElemChar :: Char -> Bool 
isElemChar x = elem x ['A'..'Z'] || elem x ['a'..'z'] 

當我嘗試使用功能如下:

isElemChar 5 

然後我有例外:

<interactive>:73:12: error: 
    * No instance for (Num Char) arising from the literal `5' 
    * In the first argument of `isElemChar', namely `5' 
     In the expression: isElemChar 5 
     In an equation for `it': it = isElemChar 5 
*Cipher Data.Char> isElemChar 'a' 

如何使功能更安全?哪種方法可以使其達到全部功能?

我可以使用Maybe數據類型,但不知道如何實現它。

+0

你試圖將一個數字傳遞給一個只接受'Char'的函數。試試'isElemChar'5''。 – Cirdec

+0

如果用戶會傳遞5而不是'5'如何處理異常? –

回答

11

您的功能安全。你提到的「異常」實際上是編譯時錯誤,這正是你想要錯誤的時候。

這是稍微你在交互模式提示符的事實隱藏,但如果你寫的程序safe.hs ....

isElemChar :: Char -> Bool 
isElemChar x = elem x ['A'..'Z'] || elem x ['a'..'z'] 

main = print $ isElemChar 5 

...你試圖編譯它...

ghc safe.hs 

...你會得到一個類似的錯誤

safe.hs:5:27: error: 
    • No instance for (Num Char) arising from the literal ‘5’ 
    • In the first argument of ‘isElemChar’, namely ‘5’ 
     In the second argument of ‘($)’, namely ‘isElemChar 5’ 
     In the expression: print $ isElemChar 5 
0

沒有必要使函數多個S afe,這不是python,函數params有一個類型,所以你的代碼只會給你一個compile error。 如果您正在處理IO,您將永遠得到一個IO([Char])IO(Char)