首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从应用程序的角度理解Haskell型系统

从应用程序的角度理解Haskell型系统
EN

Stack Overflow用户
提问于 2014-12-02 11:08:38
回答 1查看 92关注 0票数 4

我在玩Control.Applicative,我意识到我不理解Haskell类型系统的所有内容。

这是我在古驰的实验:

代码语言:javascript
运行
复制
λ :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

λ :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b

<*>的第一个参数的类型是f (a -> b)

  • 为什么这个说法是正确的?
  • 它如何与(pure 2)统一,因为常量2不是a -> b类型
  • Num (a -> b)是什么意思?具有a -> b类型的函数如何成为Num的实例?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-02 11:39:46

<*>的第一个论点应该是f (a -> b)。因此,给定(<*>) (pure x),如果x是某种函数,则这是很好的类型。

2的类型是Num a => a。换句话说,只要2Num的一个实例,它就可以是任何可能的类型。

因此,在表达式(<*>) (pure 2)中,如果2的类型是函数类型,并且该函数类型有一个Num实例,则这是很好的类型。

当然,您几乎没有理由希望函数有一个Num实例。但编译器不知道这点。所有的说法是,如果有这样的一个实例,那么表达式将成为良好的类型。

(这与您有时看到的错误类似,编译器希望某些类型同时成为IntegralFractional的实例。对人类来说,这是一个荒谬的组合。对机器来说,它们只是两个普通的阶级.)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27247921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档