看了兩本書《haskell趣學指南》《real world haskell》,都對這裏語焉不詳。
根據我自己的理解,Parameterised types就是其他語言中泛型在一個函數式語言中的特殊表示法。
這兩本書都出現了下面一段代碼,而沒有詳細的解釋
data Maybe a = Just a
| Nothing
用比較熟悉的詞彙來說,Maybe就是一個類名,a是泛型參數名,類似Java的t。
然後|兩邊分別是兩個類構造器。
就是說 Just和Nothing只是構造器方法名,兩個方法都可以構造出一個maybe對象。只是Just接受一個類型參數,而nothing沒有參數
等價的java表示
public class Maybe<A> {
//等價於Just A
public Maybe(A value)
{
}
//等價於Nothing
public Maybe()
{
}
}
唯一的區別就是java強制讓構造器名字和類名一樣,而haskell沒有這個限制而已。
然後還有一個Recursive types,在這兩本書裏也是解釋的不明不白,《haskell趣學指南》更是翻譯成什麼”遞歸的定義數據結構”
--定義一個list
data List a = Cons a (List a)
| Nil
這個意思也很簡單啊,就和上面說的一樣,|就是用來間隔構造器的,所以Nil和 Cons a (List a)這兩個東西都是屬於List類型
然後Cons a (List a)又可以解釋爲 連接a類型和一個List a類型
這也沒什麼啊,等價的java代碼類似於這樣(這裏只是一個比喻,語言不同,當然也不可能完全等價)
public class List<A> {
//等價於Cons a (List a)
public List(A value,List<A> values)
{
}
//等價於Nil
public List()
{
}
}
學習haskell的時候要記住他的一個設計理念。就是儘可能把命令式語言裏可以用其他語言表達的結構轉化成多個方法的組合。所謂的高階函數,Recursive types,Parameterised types,pattern matching其實都是這個理念的體現而已。
這個是上面那個list類型的等價方法實現
fromList (x:xs) = Cons x (fromList xs)
fromList [] = Nil
然後是一個二叉樹的例子
其實haskell就是省略掉了明確的調用構造器,而直接描述了方法體
data Tree a = Node a (Tree a) (Tree a)
| Empty
deriving (Show)
我的github
https://github.com/luckyCatMiao