[英]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種主要方式: type
, newtype
, data
和class
。
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
相同的內存,但在編譯時MyInt
和Int
不能互換使用。 這些在以后變得非常有用。 與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
那么Integer
與Node
類型不同,反之亦然。 要將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.