簡體   English   中英

了解Haskell中的數據結構

[英]understanding data structure in Haskell

我的作業有問題(主題是:“功能數據結構”)。 請理解我不希望任何人解決我的作業。 我只是理解這個結構的問題:

data Heap e t = Heap {
 empty :: t e,
 insert :: e -> t e -> t e,
 findMin :: t e -> Maybe e,
 deleteMin :: t e -> Maybe (t e),
 merge :: t e -> t e -> t e,
 contains :: e -> t e -> Maybe Int
}

在我的理解中,“空”“插入”等是可以應用於“堆”類型數據的函數。 現在我只想了解“Heap”的樣子。 所以我輸入的內容如下:

  a = Heap 42 42

但我得到的錯誤我無法真正使用。

也許這是一個愚蠢的問題,我只是無緣無故地停留在這一點上,但此刻它正在殺死我。 感謝任何幫助

如果您真的希望了解該類型,則需要首先了解一些必要條件。

類型和值(和函數)

首先,您需要了解哪些類型和值。 我假設你明白這一點。 例如,你理解"hello"作為一個值與它的類型之間的分離, String和你清楚地理解當我說a = "hello" :: String時它意味着什么:

a :: String
a = "hello"

如果您不理解,那么您需要研究Haskell中的值和類型。 這里有無數的書可以提供幫助,例如我幫助創作的這本書: http//happylearnhaskelltutorial.com

我也會假設您了解功能currying是什么,以及如何使用它們。

多態類型

其次,由於您的示例包含類型變量,您需要了解它們是什么。 也就是說,您需要了解多態類型是什么。 所以,例如, Maybe a或者Either ab ,你需要理解Maybe StringMaybe Int不同之處以及Num a => [a]甚至是什么,比如Num a => [Maybe a]是。

同樣,有許多免費或付費書籍可以提供幫助,上面的例子也涵蓋了這一點。

代數數據類型

接下來是代數數據類型。 這是Haskell的一個非常酷的功能。 類似Haskell的語言,比如Elm和Idris,以及像Rust這樣的其他語言。 它允許您定義自己的數據類型。 這些不僅僅是像其他語言中的Structs這樣的東西,是的,它們甚至可以包含函數。

Maybe實際上是代數數據類型的一個例子。 如果您了解這些,您就會知道:

data Direction = North | South | East | West

定義一個名為Direction的數據類型,其值只能是NorthSouthEastWest ,並且您將知道您還可以使用上面的polymorhpic類型變量來參數化您的類型,如下所示:

data Tree a = EmptyNode | Node (Tree a) (Tree a)

它使用兩個選項(如上面的Direction 類型 )以及參數化。

除此之外,您還可以在每個值中包含多種類型 這些被稱為產品類型 ,Haskell的代數數據類型可以表示為可以包含產品類型的Sum類型的組合。 例如:

type Location = (Float, Float)
data ShapeNode = StringNode Location String | CircleNode Location Float | SquareNode Location Float Float

也就是說,每個值可以是StringNodeCircleNodeSquareNode ,並且在每種情況下,給每個值賦予不同的字段集。 例如,要創建StringNode ,您需要傳遞構造函數的值,如下所示: StringNode (10.0, 5.3) "A String"

同樣,免費提供的書籍將更詳細地介紹這些內容,但我們現在正朝着不僅僅是對Haskell的基本理解的方向前進。

最后,為了充分理解您的示例,您需要了解...

記錄類型

記錄類型與上面的產品類型相同,只是字段是標記的而不是匿名的。 因此,您可以像這樣定義形狀節點數據類型,而不是:

type Location = (Float, Float)

data ShapeNode
  = StringNode { stringLocation :: Location, stringData :: String }
  | CircleNode { circleLocation :: Location, radius :: Float }
  | SquareNode { squareLocation :: Location, length :: Float, height :: Float }

每個字段都被命名,您不能在數據值中重復相同的名稱。

除此之外,您需要的所有內容都是為了理解上面的示例,即實現您的示例包含所有這些內容,以及您在所擁有的數據類型中具有作為記錄字段值的函數的事實。

徹底充實你的理解而不是跳過任何步驟是一個好主意,那么你將來可以更容易地遵循這些事情。 :) 祝你好運!

Heap是六個元素的記錄。 要創建該類型的值,您必須提供所有六個元素。 假設您有適當的值和函數,您可以創建如下值:

myHeap = Heap myEmpty myInsert myFindMin myDeleteMin myMerge myContains

然而,這似乎不是慣用的Haskell設計。 為什么不定義與數據無關的泛型函數,或者,如果必須將它們捆綁在一起,則為類型類?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM