- 博客(8)
- 收藏
- 关注
转载 R语言里的“宏”
最近在看R,不过还是习惯性地对语言特性感兴趣。R也可以操作代码本身,有一个类似lisp 宏的系统。不过他更像IO language,利用延迟计算+代码操作,可以完成类似lisp宏的功能,定义新的“语法结构”。 一个例子: 我们实现一种机制可以部分地给一个函数的参数来得到一个新的函数(柯瑞化)。 比如我们有一个函数如下: f <- function(a, b, c) a如果我...
2015-04-07 16:35:00
869
转载 haskell中类型的等价表示(2)–Sum
前面给了一个Product的等价表示,还有一种是Sum的。同样的先给出两种表示。表示:data S a b = L a | R b等价的表示:newtype S' a b = S' { unS' :: forall r. (a -> r) -> (b -> r) -> r }证明:这里对于S’,forall r限制了可...
2015-03-23 23:45:00
197
转载 haskell中类型的等价表示(1)–Product
这里我想讨论下一些haskell类型的等价表示。对于一个类型我们可以给出不同的表示。通常我们会使用所谓代数数据结构,但是其实那不是必须的。我们需要的是函数,以及RankNTypes。表示:通常我们使用data定义一个product如下。data P a b = P a b等价的我们可以用一个函数类型来表示‘同样的类型’。newtype P' a b ...
2015-03-23 18:06:00
178
转载 Lens in Scala
函数式访问器在haskell里被叫做Lens。在面向对象语言里这个没有什么必要,不过作为练习,我们看如何在scala表示van Laarhoven lens.先给出haskell里的lens类型:type Lens s a = forall f. Functor f => (a -> f a) -> (s -> f s)这里有一个全局量词for...
2015-03-16 12:40:00
123
转载 在scala中使用for表达式做monad运算
在haskell中,我们有语法糖‘do’帮助表达monad运算。scala中我们也有相应语法糖‘for’。 for表达式会被scala compiler做一些变换,简单的例子如下: for { a <- foo b <- bar} yield (a + b)===>foo.flatMap((a) => { bar.map((b) =&...
2015-03-12 13:21:00
94
转载 State Monad in C++
一个C++版本的State Monad。 需要C++11。#include <functional>template<template<typename> class M> struct Monad { template<typename A> M<A> ret(A); template<...
2015-03-11 20:50:00
165
转载 Monad in Scala
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的参数。它是一个高阶类...
2015-03-11 00:05:00
102
转载 Rust 还不支持higher-kinded types
最近又尝试了Rust,发现变化了好多。以前比较像走scala的路线,现在似乎定了方向,作为system language所以砍掉了很多东西。看到trait就想到了haskell的type class,所以试了试看能不能实现一个monad。不过不幸的是,马上发现它的generic不支持高阶参数。不过,Rust似乎并不反对加入higher-kinded types,而且因为是向后兼容...
2015-03-04 13:40:00
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人