我在理解这段代码时缺少什么关键的直觉?我不明白这些是如何组成的。首先需要一个函数(a->c)和构造类型(fab)。然而,第二次产量(时尚)。此外,第一和第二是根据看起来循环的双图来定义的。
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap g h = first g . second h
first :: (a -> c) -> f a b -> f c b
first g = bimap g id
second :: (b -> d) -> f a b -> f a d
second = bimap id
Run Code Online (Sandbox Code Playgroud) 我正在阅读 Bartosz Milewski 所著的《程序员的范畴论》,第 12 页。164 他为 Reader Functor 引入了一个自然变换:
newtype Reader e a = Reader (e -> a)
instance Functor (Reader e) where
fmap f (Reader g) = Reader (\x -> f (g x))
Run Code Online (Sandbox Code Playgroud)
我很难理解这种转换的类型签名。
我最好的猜测是这样的:
fmap :: (a -> b) -> (Reader e -> a) -> (Reader e -> b)
Run Code Online (Sandbox Code Playgroud)
我很困惑的是,函子是在部分应用 Reader 的情况下声明的Reader e,然后在第二行上声明f,g这是两个函数参数。然后,有一个 lambda 表达式x。由于 没有值x,我假设Reader(\x -> ....)lambda 表达式已部分应用。是否x引用了一些外部值?在哪里e发挥作用?
那么,fmap实例如何满足呢fmap …
haskell ×2