2010-02-16 65 views
18

我有理解仿函子的問題,具體是什麼混凝土類型是在LYAH中。我相信這是因爲我不明白[]究竟是什麼。Haskell中的[](list構造函數)是什麼?

fmap :: (a -> b) -> f a -> f b 
  1. [],一個類型構造?或者,它是一個價值構造函數嗎?
  2. 這是什麼意思?[] :: [a]
  3. 它是否像Maybe類型構造函數或Just值構造函數?
    1. 如果是喜歡Just那麼怎麼來Just有一個像Just :: a -> Maybe a而非Just :: Maybe a簽名,換句話說,爲什麼不[]類型[] :: a -> [a]
  4. LYAH說這個,因爲它適用於函子:公告我們怎麼沒有寫實例Functor [a],因爲從fmap ::(a - > b) - > fa - > fb,我們看到f必須是一個類型構造函數。 [a]已經是一個具體類型(其中包含任何類型的列表),而[]是一種類型構造函數,它可以接受一種類型,並且可以生成[Int],[String]或甚至[[String]]類型。雖然[]的類型意味着它就像[a]的字面意思,但我很困惑LYAH想要達到什麼目的?
+1

如果你想要某種類型的a - > [a],那就是有趣的(:[])函數。 – 2010-02-16 07:00:36

+0

^或者您可以使用'return'(或'pure'或其他):D – 2010-02-17 21:10:59

+1

@DanielVelkov:':[]'是':'部分應用於'[]'使用部分語法,只是爲了清楚。 – mk12 2012-07-18 03:55:02

回答

15
  1. 它(容易混淆的,我會向您授予)語法重載既類型構造和值構造。

  2. 這意味着,(該值構造)[]具有,對於所有類型的a,它是a列表(其被寫入[a])的類型。這是因爲每種類型都有一個空列表。

  3. 值構造[]不輸入a -> [a],因爲空列表沒有任何元素,因此它並不需要一個a做出的a的空單。改爲與Nothing :: Maybe a進行比較。

  4. LYAH在談論類型構造[]有一種* -> *,而不是價值的構造與[][a]

+5

知道作爲一種類型,'[a]'是'[] a'的語法糖可能會有所幫助,這看起來更像是事情通常對於更高級別的類型是如何做的。 – 2010-02-17 21:07:06

8
  1. 它是一個類型構造(例如,[INT]是一種類型),以及一個數據構造([2]是一個列表結構)。
  2. 空的列表是保持任何類型的列表
  3. 並[a]是象也許,[2]是像僅有2.
  4. []是零元函數(常數),以便它不」沒有功能類型。
+1

我*真的*喜歡4中的措辭。我認爲它將你的答案和4的結合以及Doug對3的答案結合在一起,讓我感到滿意!所以'Nothing :: Maybe a'和'[] :: [a]'是空構造函數。 '[a]'也是'Maybe a'的模擬,因爲它們都是值的值構造器(從Nothing開始)。結論是,我被'[]'弄糊塗了,因爲'[]'基本上與Array的Nothing的data-constructor重疊的Data的構造函數,其中'Maybe a'有兩個獨立的構造函數。我對麼? – 2010-02-16 03:12:41

5

只是爲了讓事情變得更加明確,這個數據類型:

data List a = Cons a (List a) 
      | Nil 

...具有相同的結構,內置列表類型,但沒有(更好,但可能混淆)的特殊句法。下面是一些書信樣子:

  • List = [],類型構造有一種* -> *
  • List a = [a],類型與種類*
  • Nil = [],重視與多態類型List a[a]分別爲
  • Cons = :,類型爲a -> List a -> List a和的數據構造函數分別
  • Cons 5 Nil = [5]5:[],單元素列出
  • f Nil = ... = f [] = ...,模式匹配空列表
  • f (Cons x Nil) = ... = F [X] = ...`,模式匹配單元素列表
  • f (Cons x xs) = ... = f (x:xs) = ...,模式匹配非空列表

事實上,如果你問ghci約[],它告訴你漂亮m UCH相同的定義:

> :i [] 
data [] a = [] | a : [a]   -- Defined in GHC.Types 

但你不能寫這樣的自己定義,因爲列表中的語法和它的「outfix」式的構造器是一種特殊情況,在語言規範中定義。

+0

你能解釋更多關於最後一部分'a:[a]'而不是'a:[]'是空列表'[]'類型'[a]',定義的第一部分'data [] = [] | a:[a]'會讓我相信它是'[]'。 '[]'是否也滿足'[a]'的要求? – 2010-02-16 16:27:33

+0

我不確定你在問什麼。在'a:[a]'中,':'定義數據構造函數(如'Cons'),'[a]'指定構造函數的參數類型(如'List a')。在定義的第一部分,'[]'是一個沒有參數的數據構造函數,比如'Nil'。這兩個部分都生成'[a]'類型的值,因爲這正是定義的內容! – 2010-02-16 18:03:15

+3

也許令你驚慌的是*數據構造函數*不必將代表所有(或任何)參數的參數傳遞給*類型構造函數*?在'數據中或者b =左a |對於b',數據構造函數'Left a'仍然會創建一個類型爲''或b''的值,即使沒有'b'。 'Nothing'和'[]'也一樣。你甚至可以擁有像'數據NoValue a b c d e f =孤獨'之類的東西。即使它不包含任何值,「孤獨」仍然受到所有這些類型參數的影響,使它與任何不同類型的「孤獨」截然不同。 – 2010-02-16 18:14:18

18

類型被描述(在GHCI會話)爲:

$ ghci 
Prelude> :info [] 
data [] a = [] | a : [a] -- Defined 

我們還可以考慮它,就好像它被定義爲:

data List a = Nil 
      | Cons a (List a) 

data List a = EmptyList 
      | ListElement a (List a) 

類型構造函數

[a]是一種多態數據類型,它也可以寫成[] a,如上所述。這可想過,就好像是List a

在這種情況下,[]類型構造服用一種說法a和返回類型[] a,也允許寫成[a]

一個可寫像函數的類型:

sum :: (Num a) => [a] -> a 

數據構造

[]數據構造這實質上意味着 「空列表。」這個數據構造函數不帶任何值參數。

還有另一個數據構造函數:,它將元素預先放在另一個列表的前面。這個數據構造函數的簽名是a : [a] - 它接受一個元素和另一個元素列表並返回一個結果元素列表。

[]表示法也可以用作速記來構建列表。通常我們會構建一個列表如下:

myNums = 3 : 2 : 4 : 7 : 12 : 8 : [] 

這被解釋爲

myNums = 3 : (2 : (4 : (7 : (12 : (8 : []))))) 

但哈斯克爾允許我們也使用簡寫

myNums = [ 3, 2, 4, 7, 12, 8 ] 

的意義等同,但略有外觀更好,符號。

曖昧案例

有是常見的一個模糊的情況下:[a]。根據上下文的不同,這種表示可以是「a的列表」或「僅包含一個元素的列表,即a」。第一個含義是當[a]出現在類型中時的預期含義,而第二個含義是當[a]出現在內時的預期含義。

+0

應該是'sum ::(Num a)=> [a] - > a'(帶** - > **)? – psmears 2017-07-25 13:00:22

+0

@psmears - 是的,謝謝。 – yfeldblum 2017-07-26 08:37:58

相關問題