[英]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 String
與Maybe Int
不同之處以及Num a => [a]
甚至是什么,比如Num a => [Maybe a]
是。
同樣,有許多免費或付費書籍可以提供幫助,上面的例子也涵蓋了這一點。
接下來是代數數據類型。 這是Haskell的一個非常酷的功能。 類似Haskell的語言,比如Elm和Idris,以及像Rust這樣的其他語言。 它允許您定義自己的數據類型。 這些不僅僅是像其他語言中的Structs這樣的東西,是的,它們甚至可以包含函數。
Maybe
實際上是代數數據類型的一個例子。 如果您了解這些,您就會知道:
data Direction = North | South | East | West
定義一個名為Direction
的數據類型,其值只能是North
, South
, East
或West
,並且您將知道您還可以使用上面的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
也就是說,每個值可以是StringNode
, CircleNode
或SquareNode
,並且在每種情況下,給每個值賦予不同的字段集。 例如,要創建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.