作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我偶然发现了这段代码fold ((,) <$> sum <*> product)
带有类型签名 :: (Foldable t, Num a) => t a -> (a, a)
我完全迷路了。
我知道它做了什么,但我不知道怎么做。所以我试图在 ghci 中把它分解成小块:
λ: :t (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b
λ: :t (,)
(,) :: a -> b -> (a, b)
λ: :t sum
sum :: (Foldable t, Num a) => t a -> a
λ: :t (,) <$> sum
(,) <$> sum :: (Foldable t, Num a) => t a -> b -> (a, b)
t a -> a
进入
f a
但它是如何完成的对我来说是个谜。 (
sum
甚至不是
Functor
的实例!)
f a
是某种盒子
f
包含
a
但看起来意义要深得多。
最佳答案
仿函数 f
在您的示例中是所谓的“阅读器仿函数”,其定义如下:
newtype Reader r = Reader (r -> a)
Functor
和
Applicative
实例如下所示:
instance Functor f where
fmap :: (a -> b) -> (r -> a)_-> (r -> b)
fmap f g = \x -> f (g x) -- or: fmap = (.)
instance Applicative f where
pure :: a -> (r -> a) -- or: a -> r -> a
pure x = \y -> x -- or: pure = const
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
frab <*> fra = \r -> frab r (fra r)
r
产生一个类型
a
.
(,) <$> sum
:
:t (,) :: a -> b -> (a, b)
:t fmap :: (d -> e) -> (c -> d) -> (c -> e)
:t sum :: Foldable t, Num f => t f -> f
d
输入
a ~ f
,
e
至
b -> (a, b)
和
c
至
t f
.现在我们得到:
:t (<$>) -- spcialized for your case
:: Foldable t, Num f => (a -> (b -> (a, b))) -> (t f -> f) -> (t f -> (b -> (a, b)))
:: Foldable t, Num f => (f -> b -> (f, b)) -> (t f -> f) -> (t f -> b -> (f, b))
:t (,) <$> sum
:: Foldable t, Num f => (t f -> b -> (f, b))
关于Haskell:类型 f a 实际上是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40291206/
我是一名优秀的程序员,十分优秀!