我有以下功能:
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 :(得分:11)
您的功能 是安全的。 &#34;例外&#34;你提到的实际上是一个编译时错误,这正是你想要错误的时候。
您在交互式提示下稍微隐藏了这一点,但如果您编写了程序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
答案 1 :(得分:0)
没有必要让函数更安全,这不是python,函数params有一个类型,所以你的代码只会给你一个compile error
。
如果您正在处理IO
,则会始终获得IO([Char])
或IO(Char)
。