任何人都可以解释为什么异常可能会被抛出IO monad,但可能只会被捕获到它内部?
它们(幂等函数和确定性函数)只是在给定相同输入的情况下返回相同结果的函数吗?
或者是否有我失踪的区别?(如果有区别,请你帮我理解它是什么)
我正在学习Haskell.我选择这种语言的动机之一是编写具有高度鲁棒性的软件,即完全定义的函数,数学上确定的函数,永不崩溃或产生错误.我并不是指由系统的谓词("系统内存不足","计算机着火"等)引起的故障,这些都不是很有趣,并且可能只是使整个过程崩溃.我也不是指由无效声明(pi = 4)引起的错误行为.
相反,我指的是错误状态导致的错误,我希望通过严格的静态类型使这些状态不可表示和不可编译(在某些函数中)来删除.在我看来,我把这些功能称为"纯粹",并认为强类型系统可以让我实现这一目标.但是,Haskell并没有以这种方式定义"纯",并允许程序error在任何上下文中崩溃.
这是完全可以接受的,并不奇怪.然而,令人失望的是,Haskell似乎没有提供某些功能来禁止可能导致分支使用的函数定义error.
这是一个人为的例子,为什么我觉得这令人失望:
module Main where
import Data.Maybe
data Fruit = Apple | Banana | Orange Int | Peach
deriving(Show)
readFruit :: String -> Maybe Fruit
readFruit x =
case x of
"apple" -> Just Apple
"banana" -> Just Banana
"orange" -> Just (Orange 4)
"peach" -> Just Peach
_ -> Nothing
showFruit :: Fruit -> String
showFruit Apple = "An apple"
showFruit Banana = "A Banana"
showFruit (Orange x) …Run Code Online (Sandbox Code Playgroud)