
最可怕的事情还是发生了。
对着阿里云玩了一周以后,我发现我开始爱上阿里云了…做梦都是k8s的master的负载均衡,用deployment的yaml文件,把service绑定到某些label的Pod上,同样用loadbalance对多个Pod做负载均衡…
言归正传,既然Haskell作为邪教语言,我还是要记下它的一些要点:
1. 千万不要将Haskell的类型类与面向对象OO里的Class的概念搞混淆。
类型类是一组函数的集合,如果将某类型实现为某类型类的实例,那就需要为这一类型提供这些函数的相应实现。也就是说,你要说你是某类型类的一个实例,那你必须实现这个类型类所描述的行为,实现这些函数集合。拿相等性函数举例:(==) :: (Eq a) => a -> a -> Bool, 其中,=> 表示约束符号,左侧是类型约束:(Eq a),可以理解为:“相等性函数取两个相等类型的值作为参数并返回一个布尔值,而这两个参数的类型a同为Eq类的实例。” 也即,a这个类型变量必然定义和实现了==这个函数(这里a叫类型变量,也就是其他语言里的泛型)
Eq类型类的函数集合包含两个==(相等性函数)和/=(不等性函数), 主要实现了这两个函数的类型,都叫Eq类型类的一个实例。注意:不要跟OO里的Class搞混淆。
目前,所有基础常见类型(Int, Float, Char, etc.) 都是Eq类型类的实例。
2. Haskell是个静态类型语言,它必须在编译之前搞清楚所有表达式的类型。例如:在调用read类型类后,不做计算或着类型注解(e.g. read "5" - 2 或 read “5” :: Int) 那么编译器会搞不清返回类型是什么?
3. 一个类型可以是多个类型类的实例,比如Char类型就是多个类型类的实例,一个类型类也包含多个类型作为实例。
4. 函数式编程的一般思路:先取一个初始的集合并将其变形,随后持续利用过滤条件缩小计算范围,最终取得一个(或多个)最终解。
例如:用Haskell来找到满足以下条件的直角三角形:
* 三边长度皆为整数;
* 三边长度皆小于等于10;
* 周长为24的直角三角形。
实现:rightTriangles = [ (a, b, c | c <- [1..10], a <- [1..c], b <- [1..10], a^2 + b^2 == c^2, a + b + c == 24 ]
以上。
手机码字太痛苦了…

网友评论