试图更好地理解Haskell中Applicative仿函数的(< *>)函数

时间:2015-07-30 13:46:16

标签: haskell

我刚刚完成了了解你是一个很好的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会话的快照,可以在必要时添加它们。我读了一些相关的帖子,但似乎没有什么可以启发我。

1 个答案:

答案 0 :(得分:10)

撰写(扩展)时

let b = (3+) <$> Just (5+)

结果值,根据<$>的定义(只是fmap!)是:

Just (3 + (5+))

您正在为某个功能添加号码!这就是为什么你会遇到奇怪的类型错误。

具体来说,Haskell拼命想假装(5+)是一个数字:

b :: (Num (a -> a), Num a) => Maybe (a -> a)

它说, 如果 有一些疯狂的aa和{{1}这两个都是(a -> a)的实例,我可以将它们一起添加到Functor中,就像它们是数字一样,然后给你一个结果Num但是,一般情况下,函数不是Maybe (a -> a)类型类的实例,所以一切都爆炸了。

你打算写:

Num

确实可以按预期工作(let b = ((3+).) <$> Just (5+) )。