Seija
首页
Travellings
登录
注册
首页
文章
Haskell类型类高级扩展详细说明
## 前言 我们对Haskell最普通的类型类定义和实现已经很了解了,但是当我们要自己实现一些稍微大型的项目的时候,总是会碰到更种奇怪的扩展,和各种奇怪的错误。这里详细的展开介绍一下Haskell中那些类型类相关的扩展和概念。 一个关于类型类的提示是:
`类型类并不等同于面向对象语言中的接口,类型类函数在调用时每个类型参数的类型必须是确定的`
,所以在面向对象中用到接口的地方,在Haskell里面有的时候要用`typeclass`,有的时候要用`data`或者`newtype`定义存储函数的数据类型。 ### MultiParamTypeClasses 多参数类型类,不开启这个扩展的话类型类只能有一个参数。 #### 函数使用所有类型参数作为参数 在类型类的函数里面两个类型参数都作为参数使用是比较简单的情况。 例子: ```Haskell class GEq a b where equals:: a -> b -> Bool instance GEq Bool String where equals True "true" = True equals _ _ = False ``` #### 函数使用其中一个作为返回值,但是返回值类型是可以确定的 当其中一个作为返回值时,我们要注意添加类型签名防止歧义。 ```Haskell class Fun a b where fun::a -> b instance Fun Int String where fun i = show i instance Fun Int Bool where fun i = i > 100 --(fun (5::Int))::String --(fun (5::Int))::Bool ``` ### FunctionalDependencies 如果有两个类型参数a,b,类型a决定了类型b是什么。那么就可以使用FunctionalDependencies。 ```Haskell class Fun a b | a -> b where fun:: a -> b instance Fun Int String where fun = show --fun (4::Int) ``` 当类型参数有三个的情况 ```Haskell class (Num a,Num b,Num c) => GPlus a b c | a b -> c where plus::a -> b -> c ``` ### 零参数类型类 ```Haskell class Config where os_address::String start::Config => IO () start = do print $ os_address <> "123" ``` ### 关联类型 和FunctionalDependencies差不多 ```Haskell class PrivKey a where type SumPubType a:: * pubType::a -> SumPubType a instance PrivKey Bool where type SumPubType Bool = Int pubType _ = 0 ttt::Int ttt = ppp True ```
登录
登录
注册
最热文章
引擎中Template DSL的设计思考总结
10-19
ReaderT 设计模式
04-23
非主流引擎开发不出来 (n+1) : purescript侧结构设计
04-04
FRP系统的设计
03-17
非主流引擎开发不出来 (1) : 轻骨架
02-11
非主流引擎开发不出来 (0) : 引擎定位
12-09
Rust的ECS库specs
11-20
Haskell类型类高级扩展详细说明
05-31
CMake 速览
05-29
尼采导读:超人与永恒轮回
02-24
为什么elm的结构并不是最合理的?
02-20
React速览
02-20
尼采命运之爱
02-18
AspNetCore 速览
02-17
由Haskell和面向对象引出的关于抽象的思考
12-26
二进制文件压缩工具upx
12-24
Reflex介绍
12-17
Web的前端渲染和WebApi
12-16
前端FRP框架深度踩坑
12-16
Yesod - RESTful (11)
12-16
链接
github
gitee