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 

这种类型的签名告诉我,

  1. 功能square没有任何副作用。它不会偷偷摸摸地更新数据库,或者在屏幕上打印某些内容,或者更改某些状态数据,否则会让我感到惊讶。 (例如,在Java或C中,我将不得不阅读函数及其调用的任何函数,或依赖文档来知道函数的功能。)

  2. 每次我用特定的价值,比如说,square 5,我会得到完全一样的结果。这被称为参考透明度,它允许编译器做一些优化,因为它知道这个值永远不会改变,所以只需要计算一次。

以上是 Monads的'红色管'不同于类型? 的全部内容, 来源链接: utcz.com/qa/261135.html

回到顶部