摘要: 最近在看R,不过还是习惯性地对语言特性感兴趣。R也可以操作代码本身,有一个类似lisp 宏的系统。不过他更像IO language,利用延迟计算+代码操作,可以完成类似lisp宏的功能,定义新的“语法结构”。 一个例子: 我们实现一种机制可以部分地给一个函数的参数来得到一个新的函数(柯瑞化)。 比如我们有一个函数如下: f function(b, c) f(1, b, c) 这里为了实现简单... 阅读全文
posted @ 2015-04-07 16:35 wehu 阅读(2495) 评论(0) 推荐(0) 编辑
摘要: 前面给了一个Product的等价表示,还有一种是Sum的。同样的先给出两种表示。表示:data S a b = L a | R b等价的表示:newtype S' a b = S' { unS' :: forall r. (a -> r) -> (b -> r) -> r }证明:这里对于S’,f... 阅读全文
posted @ 2015-03-23 23:45 wehu 阅读(1133) 评论(0) 推荐(0) 编辑
摘要: 这里我想讨论下一些haskell类型的等价表示。对于一个类型我们可以给出不同的表示。通常我们会使用所谓代数数据结构,但是其实那不是必须的。我们需要的是函数,以及RankNTypes。表示:通常我们使用data定义一个product如下。data P a b = P a b等价的我们可以用一个函数类型... 阅读全文
posted @ 2015-03-23 18:06 wehu 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 函数式访问器在haskell里被叫做Lens。在面向对象语言里这个没有什么必要,不过作为练习,我们看如何在scala表示van Laarhoven lens.先给出haskell里的lens类型:type Lens s a = forall f. Functor f => (a -> f a) ->... 阅读全文
posted @ 2015-03-16 12:40 wehu 阅读(788) 评论(0) 推荐(0) 编辑
摘要: 在haskell中,我们有语法糖‘do’帮助表达monad运算。scala中我们也有相应语法糖‘for’。 for表达式会被scala compiler做一些变换,简单的例子如下: for { a foo.flatMap((a) => { bar.map((b) => { a + b }) }) 所以我们需要实现两个方法 flatMap和map。 还是用前面的state m... 阅读全文
posted @ 2015-03-12 13:21 wehu 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 一个C++版本的State Monad。 需要C++11。#include template class M> struct Monad { template M ret(A); template M bind(M, std::function(A)>);};template stru... 阅读全文
posted @ 2015-03-11 20:50 wehu 阅读(729) 评论(0) 推荐(0) 编辑
摘要: Scala有很强的类型系统。加上一些隐式规则,我们可以在scala里模拟haskell的monad。 先从haskell的monad type class开始: class Monad M where ret :: a -> M a bind :: M a -> (b -> M b) -> M b 这里M是type class的参数。它是一个高阶类型, kind是 * –> *。认识到这... 阅读全文
posted @ 2015-03-11 00:05 wehu 阅读(1308) 评论(0) 推荐(0) 编辑
摘要: 最近又尝试了Rust,发现变化了好多。以前比较像走scala的路线,现在似乎定了方向,作为system language所以砍掉了很多东西。 看到trait就想到了haskell的type class,所以试了试看能不能实现一个monad。不过不幸的是,马上发现它的generic不支持高阶参数。 不过,Rust似乎并不反对加入higher-kinded types,而且因为是向后兼容的,所以即使是... 阅读全文
posted @ 2015-03-04 13:40 wehu 阅读(325) 评论(0) 推荐(0) 编辑