Monads的'红色管'不同于类型?
我是关于monad,'pipes'和'red pipe'的reading an interesting article。从看起来它是说功能参数或类是管道的类型,以确保一切正常。然后它变成一个红色管道,并且必须始终是一个红色管道和纯净。这部分我不明白Monads的'红色管'不同于类型?
为什么'红管'不能成为'蓝管'?红色管道可以转换为普通管道吗?这与纯度有什么关系?我能想到这就像class RedPipe: PlainPipe { /* same interface and implementation here*/ }
?
回答:
在Haskell中,函数的类型告诉你它到底做了什么,更重要的是,它没有做什么。这使得更容易推理Haskell代码。
举例来说,如果我有以下类型的函数:
f :: Int -> Int
我知道,它需要一个Int
作为输入,并产生一个Int
作为输出,它也没有别的。重要的是,我知道它没有副作用。
如果我有类型的函数:
g :: Double -> State Int Double
...该功能需要一个Double
作为参数,并产生办法产生Double
,但只有当我允许它协商或修改一些Int
状态。
如果我有类型的函数:
h :: Int -> Maybe String
我知道,这个功能需要一个Int
,并可能产生String
,也可能会失败,生产什么。请注意,前两个函数都没有返回Maybe
,这意味着它们不会失败。 Haskell默认不允许失败(即可为空值)。
如果我有类型的函数:
i :: String -> IO()
我知道,这个功能需要一个String
并且可以运行产生副作用。请注意,以前的函数都没有IO
的类型,这意味着它们不会产生副作用。 Haskell默认不允许副作用。你必须明确地加入他们的类型。
这意味着我们可以查看函数或值的类型,并立即了解它们正在使用的功能。因此,例如,如果我看到类型为Maybe
,我知道可能会失败,如果我不这样做,那么我知道没有可能失败。同样,如果我在该类型中看到IO
,则我知道存在潜在的副作用,但如果我在该类型中看不到IO
,则不存在副作用的可能性。
在主流语言中,您不具备选择性“选择”功能的能力。所有功能默认情况下始终处于打开状态,这意味着您必须始终检查null
,因为您无法保证某些功能没有失败,并且您必须始终运行测试,因为您无法保证某些功能并没有暗示修改你系统的状态。
Haskell允许您限制函数的行为,使您可以更细致地控制其“权限”,这样可以更轻松地扩展到大型程序而无需使用错误,还可以更轻松地阅读和理解Haskell代码,因为类型枚举代码行为的全部范围,所以你永远不必理解类型允许的更多内容。
回答:
作者使用术语“红管”和“蓝管”作为隐喻。据我所知,这不是广泛使用的术语。我认为他的文章的关键点在于Java等语言提供的类型安全性有助于捕捉某些程序员错误,将纯从不纯函数可以捕捉更多。用他的例子之一:
square :: Double -> Double
这种类型的签名告诉我,
功能
square
没有任何副作用。它不会偷偷摸摸地更新数据库,或者在屏幕上打印某些内容,或者更改某些状态数据,否则会让我感到惊讶。 (例如,在Java或C中,我将不得不阅读函数及其调用的任何函数,或依赖文档来知道函数的功能。)每次我用特定的价值,比如说,
square 5
,我会得到完全一样的结果。这被称为参考透明度,它允许编译器做一些优化,因为它知道这个值永远不会改变,所以只需要计算一次。
以上是 Monads的'红色管'不同于类型? 的全部内容, 来源链接: utcz.com/qa/261135.html