Haskell学习笔记- Monad, IO和Functor


Posted on March 16th 2014, 09:24


Monad这个概念是第一次在Haskell中看到, 也是haskell中比较难理解的部分之一, 但同样也是很重要的部分. 今天就来看看Monad到底是什么货, 同时也来看看Functor和IO是什么?

Monad用法

在给Monad一个正式的定义之前, 先来看看Monad的标准用法:

let a = Just 1 in a >>= \x -> Just (x+2) --output Just 2

这里我们先来回顾下lambda的用法:

\x -> Just (x+2)

这个函数将输入的x加2后返回, 并且把这个值包装在Just中.

对了, 这就是Monad的标准用法, 很直观的一个好处: 让代码更加的可读和简洁. 虽然我们不知道Just的实现, 但是我们可以猜到>>=可以将Just中的东西提取出来.

Read More


Haskell学习笔记--Typeclass


Posted on February 10th 2014, 20:08


新的一年新的开始. 技术还是要连续, 继续我的haskell旅行. 今天要看看haskell中异常强大的TypeClass, type和class放在一起, 会有怎样的化学反应呢?

首先来了解这么一个事实--Haskell中语言中没有对所有类型定义==操作符. 回想下其他语言, 比如c, ==的意义是对比两个内存位置, python中则是根据不同类型对比他们的内容.那么haskell为什么没有默认的实现, 它又是怎么实现的呢?

在Haskell中, 所有操作符, 比如+, =, .等, 都是函数, 我想这也可能是他是最纯粹的函数语言的原因之一. 所以这些操作符都是由用户实现的, 而实现他们的正是标准库Prelude. 貌似扯远了, 再回到Typeclass. Haskell就是通过Typeclass从而实现了, 操作符对不同类型的支持.


Read More


Haskell学习笔记--Declarations and Bindings


Posted on January 29th 2014, 20:32


即将到年三十了, 好学的年轻人还是决定在今天花一个小时提升下自己的技能. 今天来看看Haskell 2010语言规范中的Declarations和Bindings.

Declarations

这部分在理解Haskell中很重要, 因为他诠释了haskell这门语言是如何定义事情的, 他的定义会告诉编译器把这些代码生成低级机器语言.

modulemodule modid [exports] where body
          |    body
body    →    { impdecls ; topdecls }
          |    { impdecls }
          |    { topdecls }
topdecls    →    topdecl1 ; … ; topdecln        (n ≥ 1)
topdecltype simpletype = type
          |    data [context =>] simpletype [= constrs] [deriving]
          |    newtype [context =>] simpletype = newconstr [deriving]
          |    class [scontext =>] tycls tyvar [where cdecls]
          |    instance [scontext =>] qtycls inst [where idecls]
          |    default (type1 , … , typen)          (n ≥ 0)
          |    foreign fdecl
          |    decl
decls    →    { decl1 ; … ; decln }        (n ≥ 0)
decl    →    gendecl
          |    (funlhs | pat) rhs
cdecls    →    { cdecl1 ; … ; cdecln }        (n ≥ 0)
cdecl    →    gendecl
          |    (funlhs | var) rhs
idecls    →    { idecl1 ; … ; idecln }        (n ≥ 0)
idecl    →    (funlhs | var) rhs
          |            (empty)
gendecl    →    vars :: [context =>] type        (type signature)
          |    fixity [integer] ops        (fixity declaration)
          |            (empty declaration)
ops    →    op1 , … , opn        (n ≥ 1)
vars    →    var1 , … , varn        (n ≥ 1)
fixityinfixl | infixr | infix

从上面我们可以看到有topdeclsdecls的区分, topdecls只能在module的top level中被声明, 而不能在其他的scope(比如where, let等)中被声明. Haskell把Declarations分为三个组:

  1. 用户定义的, 包含type, newtype, data
  2. 类型类和重载, 包含class, instance, default
  3. 层级的声明, 包含value binding, type signatures和fixity

Read More

Haskell学习笔记--Expression


Posted on January 27th 2014, 20:04


休息了一天,今天本想再偷懒下的,还是不能太放纵自己,把这宝贵的一小时奉献给Haskell.今天来看看haskell expression的定义.

Expression

全局的看下Haskell的expression的定义.

exp    →    infixexp :: [context =>] type        (expression type signature)
  |    infixexp
infixexp    →    lexp qop infixexp        (infix operator application)
  |    - infixexp        (prefix negation)
  |    lexp
lexp    →    \ apat1 … apatn -> exp        (lambda abstraction, n ≥ 1)
  |    let decls in exp        (let expression)
  |    if exp [;] then exp [;] else exp        (conditional)
  |    case exp of { alts }        (case expression)
  |    do { stmts }        (do expression)
  |    fexp
fexp    →    [fexp] aexp        (function application)
aexpqvar        (variable)
  |    gcon        (general constructor)
  |    literal
  |    ( exp )        (parenthesized expression)
  |    ( exp1 , … , expk )        (tuple, k ≥ 2)
  |    [ exp1 , … , expk ]        (list, k ≥ 1)
  |    [ exp1 [, exp2] .. [exp3] ]        (arithmetic sequence)
  |    [ exp | qual1 , … , qualn ]        (list comprehension, n ≥ 1)
  |    ( infixexp qop )        (left section)
  |    ( qop⟨-⟩ infixexp )        (right section)
  |    qcon { fbind1 , … , fbindn }        (labeled construction, n ≥ 0)
  |    aexpqcon{ fbind1 , … , fbindn }        (labeled update, n  ≥  1)


Read More


Haskell学习笔记三--语法


Posted on January 25th 2014, 15:36


这篇blog要记录下笔者在看haskell的BNF的种种, 希望能全面的了解haskell的语法规则.这里的语法规则主要指的是Haskell 2010.

Lexeme BNF

program    →    { lexeme | whitespace }
lexeme    →    qvarid | qconid | qvarsym | qconsym |    literal | special | reservedop | reservedid 
whitespace    →    whitestuff {whitestuff}
whitestuff    →    whitechar | comment | ncomment
whitechar    →    newline | vertab | space | tab | uniWhite
newline    →    return linefeed | return | linefeed | formfeed
returna carriage return
linefeeda line feed
vertab    →     a vertical tab
formfeeda form feed
spacea space
taba horizontal tab
uniWhite    →     any Unicode character defined as whitespace 

上面的BNF定义了haskell的程序是由lexeme和whitespace组成的,lexeme也给出了他自己的定义.这里值得关注的是newline中包含formfeed的定义,也就是ascii值为12的字符.其他的和其他语言类似.


Read More


博客搜索

广告位出租