Haskell 应用函子。<*&燃气轮机;及<$&燃气轮机;详细地
我们有签名:Haskell 应用函子。<*&燃气轮机;及<$&燃气轮机;详细地,haskell,applicative,Haskell,Applicative,我们有签名: ()::函子f=>(a->b)->f a->f b ()::应用程序f=>f(a->b)->f a->f b 让我们玩一下: (/)只有5个只有2个 =>只有2.5 )只有5)只有2 =>只有2.5 (刚好(\x->5/x))刚好2 =>只有2.5 问题: ((/) <$> Just 5) <*> Just 2 ^^^^^^^^^^^^^^^^ @@@@@@ (<$>) :: Functor f => (a -&g
()::函子f=>(a->b)->f a->f b
()::应用程序f=>f(a->b)->f a->f b
让我们玩一下:
(/)只有5个只有2个
=>只有2.5
)只有5)只有2
=>只有2.5
(刚好(\x->5/x))刚好2
=>只有2.5
问题:
((/) <$> Just 5) <*> Just 2
^^^^^^^^^^^^^^^^ @@@@@@
(<$>) :: Functor f => (a -> b) -> f a -> f b
^^^
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
^^^^^^^^^^ @@@
((/)仅5)仅2
^^^^^^^^^^^^^^^^ @@@@@@
()::函子f=>(a->b)->f a->f b
^^^
()::应用程序f=>f(a->b)->f a->f b
^^^^^^^^^^ @@@
我认为^^^^部分应按其类型匹配。为什么签名中
的返回类型与
的输入类型在视觉上不匹配
我错过了什么?谢谢。它确实匹配,但是
()
和()
函数的f
、a
和b
都是变量,每次使用该函数时,变量都是不同的变量
因此,在这里将函数定义为:
(<$>) :: Functor f => (a -> b) -> f a -> f b
(<*>) :: Applicative g => g (c -> d) -> g c -> g d
因此我们知道,(/)的类型只有5个是fb
,而g(c->d)
,而只有2个的类型是gc
。由于just2
具有类型just2::Num n=>Maybe n
,因此这意味着g~可能
和c~n
(这里x~y
意味着x
和y
是同一类型)。此外,我们可以推导出fb~g(c->d)
,因此f~可能
,b~(c->d)
我们可以进一步分析(/)仅5个表达式。我们知道,只有5个具有类型numm=>可能是m
,这意味着a~m
。函数(/)
有类型(/)::分数k=>k->k->k
,这意味着a~b~k~m
,因此我们知道(/)只有5个(/)有类型(/)只有5个::(Num m,分数m)=>可能(m->m)
,或者更不那么详细的(/)只有5个::分数m=>可能(m)
(a分数m
表示numm
)
正如我们已经发现的,b~(c->d)
,这意味着m~c~d
,因此表达式的类型是:(/)只有5)只有2::分数m=>可能是m
提示:从写出(/)的类型开始
并决定a
和b
是什么。请记住函数是通用的。谢谢。似乎您需要在以下位置进行一些更正:…因此我们知道,(/)只有5具有类型(/)只有5:(Num m,分数m)=>可能(m->m)
你能给我更多关于Applicative的提示吗?我看到了常见的多参数fn应用程序fx y z
和Applicativefx y z
之间的相似性,但是我无法想象在通常的fn应用程序世界中有任何直接的相似之处?而且我觉得部分应用程序不知何故涉及到这里?(/)只需5
,将导致只需(/)5
,因此这里涉及部分应用程序,您是正确的。只需(/)5)只需2
,然后导致只需(/)52
,因此只需2.5
。然而,为了计算fx y z
,我们没有定义任何新函数(就像我们对……和……做的一样,我仍然错过了一些元素……你说“我们不定义任何新函数”是什么意思?)?
((/) <$> Just 5) <*> Just 2
^^^^^^^^^^^^^^^^ @@@@@@
(<$>) :: Functor f => (a -> b) -> f a -> f b
^^^
(<*>) :: Applicative g => g (c -> d) -> g c -> g d
^^^^^^^^^^ @@@