January 12 2007  金曜日

本文介绍了Haskell这门函数式编程语言的独特之处,通过示例展示了其简洁直观的数据结构定义及函数编写方式,并解释了非严格(懒惰)求值机制如何简化编程流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  I am going to learn Haskell functional programming language in that I are aware
that it is nessary to do it.  The Haskell language has evolved signicantly since
its birth in 1987.  The scheme and Haskell are two polars respectively of the family
of functional programming language.

  data Tree a = Leaf a | Branch (Tree a) (Tree a)

  The above the definition of a binary tree enchanted me.  It is so simple, so intuitive.
Let's look at a function in Haskell.

  length :: [a]->Integer
  length [] = 0
  length (x:xs) = 1 + length xs

  It is different for those definitions form C, scheme, Java, and so on.  It is
intuitive, and more close to mathematical expression.  Here, -> says there is a
map from a type to another type.

  Integer -> Integer -> Integer

  We can look it like that.

  Integer -> (Integer -> Integer)

  In Haskell, the -> is actual a type constructor.  If you learned discrete mathematics,
it is easy to understand.  It make a map type.  What is map?  It usually is the synonyms
of function.  All right, if a symbol is defined by a map type, it is a function.  The function
in Haskell adapted pattern matching.  It is also easy to understand because of we are
familiar to pattern matching languages, from the macrox of scheme, or awk language, and
so forth.

  add :: Integer -> Integer -> Integer
  add x y = x + y

  This is an example of a curried function. An application of add has the form add e1 e2,
and is equivalent to (add e1 ) e2, since function application associates to the left.  In
other words, applying add to one argument yields a new function which is then applied to
the second argument.  This is consistent with the type of add, Integer->Integer->Integer,
which is equivalent to Integer->(Integer->Integer); i.e. -> associatestothe right.

  At this point we should note carefully the dierences between tuples and lists. In
particular, note the recursive nature of the list type whose elements are homogeneous
and of arbitrary length, and the non-recursive nature of a (particular) tuple type whose
elements are heterogeneous and of fixed length.  The typing rules for tuples and lists
should now also be clear:

For (e1 ,e2 , ... ,en ); n >= 2,if ti is the type of ei, then the type of the tuple is (t1,t2,...,tn).
For [e1 ,e2 , ... ,en ]; n >= 0,each e must have the same type t, and the type of the list is [t].

  In fact, a list like [1,2,3] is a tuple like (1:[2,3]), 1:(2:3:[]), in Haskell, not
in scheme.  But it is also a pair.

  Non-strict functions are also called "lazy functions", and are said to evaluate their
arguments "lazily", or "byneed".  Non-strict functions are extremely useful in a variety
of contexts.  The main advantage is that they free the programmer from many concerns about
evaluation order.

  Another way of explaining non-strict functions is that Haskell computes using definitions
rather than the assignments found in traditional languages.  Read a declaration such as:

  v = 1/0

as 'define v as 1/0' instead of 'compute 1/0 and store the result in v'.  Only if the value
(definition) of v is needed will the division by zero error occur.  By itself, this declaration
does not imply any computation.  Programming using assignments requires careful attention
to the ordering of the assignments: the meaning of the program dependson the order in which
the assignments are executed.  Definitions, in contrast, are much simpler: they can be presented
in any order without affecting the meaning of the program.

  Technically speaking, formal parameters are also patterns -- it's just that they never fail to
match a value.  As a "side eect" of the successful match, the formal parameter is bound to the
value it is being matched against.  For this reason patterns in any one equation are not allowed
to have more than one occurrence of the same formal parameter. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值