簡體   English   中英

從元組列表中獲取第一個元素

[英]Get First Elements From List Of Tuples

我有一個這種格式的列表[(Int,[(Int,Int,Float)])]。 它是一個圖表上的節點及其邊緣列表。 列表的每個元組包含:(Node,[(startNode,endNode,Weight)])。 我喜歡做的是創建所有節點的列表。 我試過這個用過:

nodes xs = map fst xs

但它不起作用,我不知道為什么。 有什么建議么?

編輯:更具體地說,這些是我正在使用的數據結構

data Graph = G [(Node, [Edge])]

data Node = N Integer

type Edge = ( Node, Node, Float )

您需要從Graph數據類型中解包數據以對其進行操作。 最簡單的方法就是做類似的事情

mapG :: ([(Node, [Edge])] -> a) -> Graph -> a
mapG f (G nodes) = map f nodes

然后你可以用它作為

> let xs = G [(N 1, []), (N 2, [])]
> mapG fst xs
[N 1, N 2]

Graph的類型不是列表,它是列表的包裝器。 您可能會考慮僅使用類型別名,因為您沒有使用Haskell數據類型的任何功能,更像是

type Edge = (Node, Node, Float)
type Node = Integer
type Graph = [(Node, [Edge])]

然后你可以輕松做到

> let xs = [(1, []), (2, [])] :: Graph
> :type xs
xs :: Graph
> map fst xs
[1, 2]

因此,快速瀏覽Haskell中的類型。 聲明可以在類型簽名中使用的東西有4種主要方式: typenewtypedataclass

type

最容易理解的是,任何聲明為type東西都只是一個別名。 所以

type Node = Integer

Integer本身完全相同。 它可以在任何使用Integer地方使用,反之亦然。 所有這些構造都是為了使您的意圖更加清晰,例如預定義的FilePath類型,它是String的別名。 如果你看到一個功能

writeToFile :: String -> String -> IO ()

相比

writeToFile :: FilePath -> String -> IO ()

你會立刻知道第二個參數是文件路徑,而不必查看其他任何內容。 類型也可用於為更復雜的類型創建同義詞,例如

type Edge = (Node, Node, Float)

現在你可以在任何你想要這個元組的地方編寫Edge ,它更加簡潔易懂。 type s也可以參數化

type List a = [a]

通過使用type ,您還可以獲得所有類型化的類型類實例,例如,您可以將兩個Node與常用的+一起添加並返回一個Node

newtype

type稍微強一些, newtype必須遵循特定的形式。 它們只有一個單一類型的構造函數,通常用作別名,你不希望人們真正看到里面的東西。 例如:

newtype MyInt = MyInt Int

創建一個名為MyInt的類型,它包含Int類型的單個值。 這在編譯時(幾乎總是)優化掉,因此一旦程序運行, MyInt占用與Int相同的內存,但在編譯時MyIntInt不能互換使用。 這些在以后變得非常有用。 type s一樣,它們可以參數化,但與類型不同,您不能免費獲得實例。 MyInt默認不實現Num ,因此您無法將它們一起添加。

data

這是一個非常復雜的主題,所以我會說很多。 data類型是全新的,而不僅僅是別名。 它可以有一個或多個構造函數,每個構造函數需要0個或多個參數。 Bool是一個具有2個構造函數的數據類型,每個構造函數都有0個參數:

data Bool = False | True

Maybe有兩個構造函數,但有一個需要參數:

data Maybe a = Nothing | Just a

在這里我們看到Maybe也參數化了。 這些data類型也不實現其內容的類型類實例,因為通常這是不可能的。 您還可以為data類型提供多個參數,例如

data Either a b = Left a | Right b

如果您有類似的數據類型

data Node = N Integer

那么IntegerNode類型不同,反之亦然。 要將Integer轉換為Node ,必須使用N構造函數。 您可以將構造函數視為一種特殊的函數,甚至可以在GHCi中詢問它們的類型:

> :type Just
Just :: a -> Maybe a

class

這是最抽象的一個。 類型類沒有直接定義類型,而是為類型類的實例提供了一種原型。 例如, Eq類型類基本上定義為

class Eq a where
    (==) :: a -> a -> Bool
    (/=) :: a -> a -> Bool
    a /= b = not (a == b)

這里Eq說實現這個類的類型必須提供函數的定義(==) ,並且可以選擇為(/=)提供定義,但是如果你不提供它,則有一個默認實現。 data Node可以實現這一點

instance Eq Node where
    (N a) == (N b) = a == b

Haskell類型系統有足夠的信息,細節和擴展,您可以填寫幾本書,所以不要指望它以任何形式全面。 我甚至沒有提到過整個主題,但這應該是一個很好的入門書。


至於生成邊緣,這取決於你。 我不知道您的圖表用於什么或者您希望將哪種數據放入其中,因此我認為我無法真正幫助您。

暫無
暫無

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

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