网络书屋(Web Reading Room)

A blogging framework for hackers.

One-parameter-Or-many-parameters?

I have a question about how to call the function when we see the type declartion.我有一个关于阅读函数声明时候,如何调用函数的疑问。 比如:

f :: (Double,Double,Double) –> (Double,Double) It is one parameter, but it must be a tuple with three tuple elements

::Double->Double->Double What does it mean?

1
2
3
4
5
6
7
areAsceneding :: Integer->Integer->Integer->Bool
areAsceneding a b c=a<b && b<c

areasceneding 1 2 3
--get true
areasceneding 1 4 2
--get false

Actually ,multiply parameter can changed into one parameter method by currying!!

You must care about the () means tuple data structure. [] means list data structure.

绑定Binding

  Haskell使用=实现绑定,前面我们说=是引用透明的案例,是一种数学意义,实际是将两者绑定了。

1
2
3
4
5
x = 2                   -- 两个连字符号表示注解

y = 3                   --    
main = let z = x + y    -- let 引入一个本地绑定
       in print z       -- 程序将打印 5

Binding名称不能大写,绑定可以定义一个或多个参数的函数,函数和参数使用空格,这是Haskell区别其他语言的简洁之处:

1
2
add arg1 arg2 = arg1 + arg2 -- 定义函数add
five = add 2 3 -- 调用函数add

  括号可以包装复合表达式:

1
2
bad = print add 2 3 -- error! (打印只能有一个参数)
main = print (add 2 3) -- ok, 使用一个参数5作为打印参数

变量是不可变的

  与命令式语言变量不同,Haskell绑定变量 不可变的:

1
2
x = 5
x = 6 -- 错误, 不能再绑定x,但是在let中则是不一样

类型有下面几种:

  • Bool – 有两个元素: True 或 False
  • Char – unicode符合集合
  • Int – 固定大小整数
  • Integer – 无限大小整数
  • Double – IEEE 浮点数字
  • type1 –> type2 – 一个输入类型type1 到输出类型 type2的函数
  • (type1, type2, …, typeN) – 类型数组tuple
  • () – 零数组tuple, 称为unit (类似C的void); 这个类型只有一个值:空。
  • [Char]–> means list pk tuple.