我刚刚完成了了解你是一个很好的Haskell 的第11章,我想在继续之前更好地理解Applicative Functors。我有以下 ghci 代码。
let a = Just (5+) -- Instead of mapping + to Just 5
let b = (3+) <$> a -- I imported Control.Applicative even though most of these modules are deprecated
let c = Just (3+) <*> a -- I expect this to be equivalent to b and :t b, :t c shows that they are the 'same'
a <*> Just 1 -- returns 6 as I expected
现在我希望b和c为:Just((3+)。(5+))这意味着我可以这样做:
b <*> Just 1 -- and get 9 as in (3+) $ (5+) 1 or ((3+) . (5+)) 1
但是我得到:没有(Num(b0 - > b0))的实例来自于使用'it'在交互式GHCI命令的stmt中:打印。
问题1:以下所示的限制意味着什么:
b :: (Num (a -> a), Num a) => Maybe (a -> a)
我认为这只意味着&lt; *&gt;可以从'b'“提取”(a - &gt; a)。在我的小道中,我知道 Num a 意味着'a'必须是Num的实例,但 Num(a - &gt; a)对我来说没有多大意义。这是否意味着Maybe中的(a - &gt; b)必须返回Num的实例?
问题2:在申请领域,我所做的一切都不可行吗?是否有任何明显的方法可以打印或查看'b&lt; *&gt;的结果?只是1'?
let Just val = b <*> Just 1
:t val -- returns ((Num (t -> t), Num t) => t which tells me that val is an instance of Num but then again I am just a beginner so what do I know?
注意:我有我的ghci会话的快照,可以在必要时添加它们。我读了一些相关的帖子,但似乎没有什么可以启发我。
答案 0 :(得分:10)
撰写(扩展)时
let b = (3+) <$> Just (5+)
结果值,根据<$>
的定义(只是fmap
!)是:
Just (3 + (5+))
您正在为某个功能添加号码!这就是为什么你会遇到奇怪的类型错误。
具体来说,Haskell拼命想假装(5+)
是一个数字:
b :: (Num (a -> a), Num a) => Maybe (a -> a)
它说, 如果 有一些疯狂的a
类a
和{{1}这两个都是(a -> a)
的实例,我可以将它们一起添加到Functor中,就像它们是数字一样,然后给你一个结果Num
!但是,一般情况下,函数不是Maybe (a -> a)
类型类的实例,所以一切都爆炸了。
你打算写:
Num
确实可以按预期工作(let b = ((3+).) <$> Just (5+)
)。