Haskell学习(3)–定义类型和函数
1. 定义新的数据类型
很多时候我们需要定义自己所需要的数据类型,在Java中往往是用类来实现的。在Haskell中,我们可以使用data操作符来实现一个新的类型,比如:data BookInfo = Book Int String [String]。其中等号左边的BookInfo表示的是这个类型的名称,等号的右边相当于是Java中的构造函数,只是构造函数的名字可以与类名一致,也可以不同,跟在名字后面的就是参数的类型,在这个例子中,一共有三个参数,分别是Int,String和String数组。
我们还可以定义一个data MagazineInfo = Magazine Int String [String],看上去和前面的参数类型完全一致,但是这已经是两个完全不同的类型了,需要辨别开。
当实现一个类型的实例的时候,可以直接使用myInfo = Book 12345 “Title” ["A.b"]来实现。
另外在定义新类型的时候,直接看到Int,String往往显得不那么直观,如果将其用有意义的名字代替会更加容易理解,这时就可以使用类型别名。如type BookID = Int, type BookName = String, type BookAuthor = [String],这样在定义新的类型的时候,可以直接写为data BookInfo = Book BookID BookName BookAuthor
有的时候,构造函数可以不只有一个,可以有多种方式来实现,比如data BillingInfo = CreditCard CardNumber CardHolder Address | CashDelivery | Invoice CustomerID。在这个类型中,BiliingInfo可以用三种方法来构造,每一种的参数类型都不相同,这样从另一个角度实现了多态。
2. 模式匹配
模式匹配比较类似于函数的调用规范,个人感觉类似于C或者Java中的switch,给定了一些判别方式,如果找到了一致的对象,即向下进行运算。比如sumList (x:xs) = x + sumList xs sum[]=0。两个表达式定义出了如何计算List的每一个元素的和。在这个匹配过程中,表达式的位置起到了很至关重要的作用,表达式会从上到下开始匹配,一旦找到了匹配的,后面就不在运行。同时,如果一个匹配的都没有找到,那么程序将会报错。
在匹配定义中,如果函数中有些无关重要的参数,可以用_来代替,它代表任意的字符或者类型。
3. 记录语法
在定义类型的时候如果采用了以下的格式去定义:data BookInfo = Book { bookID :: Int, bookTitle :: String, bookAuthor::[String]},那么在使用该类型的实例的时候,可以直接调用得到其属性的值。比如我们生成一个实例book1=Book 12345 “abc” “aaa”,如果使用bookTitle book1将可以得到”abc”,也就是说提供了一种得到变量属性的方式,而这些函数都由Haskell内部自动实现了,你所需要的值是按照这个模式定义新类型既可。
This entry was posted on Thursday, May 14th, 2009 at 11:59 pm and is filed under Haskell, IT . You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.



