gpt4 book ai didi

haskell - 函数类型为 MonadReader

转载 作者:行者123 更新时间:2023-12-02 12:47:45 26 4
gpt4 key购买 nike

我正在通过镜头 tutorial特别是,尝试了解 view 中涉及的类型。

所以,采用定义

data Atom = Atom { _element :: String, _point :: Point }
data Point = Point { _x :: Double, _y :: Double }
makeLenses ''Atom
makeLenses ''Point

让我们检查一下表达式view (point .x)的类型:

*Main> :t view (point . x)
view (point . x) :: MonadReader Atom m => m Double

因此,给定一个具有 Atom 的环境,我们可以生成一个包裹在 MonadReader 中的 Double。很好,这比镜头新手想象的更通用!

现在,让我们尝试将其应用到某些原子:

*Main> :t view (point . x) (Atom "C" (Point 1 2))
view (point . x) (Atom "C" (Point 1 2)) :: Double

给定上述类型的view (point .x),这种类型检查是如何进行的?我知道有一个 MonadReader 实例用于部分应用的函数类型 r ->,但是 ghc 如何确定在这种情况下应使用这个特定实例(当然,如果那是确实使用过的)?

最佳答案

关键点是您使用了应用程序的语法。

当你写的时候

view (point . x) (Atom "C" (Point 1 2))

您实际上正在编写应用程序 f a哪里f = view (point . x)a = Atom "C" (Point 1 2) 。要输入检查 f a GHC 最初开始于

f :: t1 -> t2     -- in prefix for rm, this is written as (->) t1 t2
a :: t1

对于一些新的类型变量 t1, t2 。所有应用程序始终都会执行此操作。(好吧,几乎。一些高级类型需要更仔细的算法,但我会忽略这一点。)

但是,GHC也知道

f :: MonadReader Atom m => m Double
a :: Atom

因此推导出t1 ~ Atomm ~ (->) t1 ~ (->) Atom 。因为这确实是一个MonadRead Atom例如,它继续进行。

关于haskell - 函数类型为 MonadReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50259647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com