如何让它更安全?

时间:2017-06-13 07:41:02

标签: haskell

我有以下功能:

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数据类型,但不知道如何实现它。

2 个答案:

答案 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)