1

私は Haskell の初心者で、使いこなそうとしていますMap.fromList。次のdataタイプを定義しました。

type No = String
data Arco = Arco { de :: No
                 , para :: No
                 , custo :: Float
                 } deriving (Show, Ord, Eq)

のリストがあり、タプルをキーおよび値としてArco使用して、それらをマップします。どうすればそれを達成できますか?(de, para)custo

ありがとう

4

2 に答える 2

3

Arco折りたたみ関数またはリスト マッピングを使用して、最初に値のリストを単純なリストに変換しMap.fromList、キーと値のペアのリストからマップを作成するだけで、これを実現できると思います。(テストされていない)の行に沿ったもの:

Map.fromList (foldr (\x res -> ((de x, para x), custo x):res) [] yourArcoList)

またはでmap

Map.fromList $ map (\x -> ((de x, para x), custo x)) yourArcoList

またはリスト内包表記で:

[((de x, para x), custo x) | x <- yourArcoList]

depara、およびcusotは、タイプ値からフィールド値を抽出できるように、Haskell によって自動的に作成される関数です。

于 2013-05-22T01:31:49.220 に答える
1

それが役立つ場合は、明示的な再帰を使用しています。

type No = String
data Arco = Arco { de :: No
                 , para :: No
                 , custo :: Float
                 } deriving (Show, Ord, Eq)

my_func xs = helper xs []
       where helper [] acc = reverse acc
             helper (x:xs) acc = let key = (de x, para x)
                                     val = custo x
                                 in helper xs ( (key, val):acc )



ghci>:l 1.hs

ghci>let a = Arco "hello" "world" 3.0
ghci>let b = Arco "goodbye" "mars" 10.0

ghci>let list = my_func [a, b]
ghci>list
[(("hello","world"),3.0),(("goodbye","mars"),10.0)]

ghci>import qualified Data.Map as M
ghci>let map = M.fromList list
ghci>map
fromList [(("goodbye","mars"),10.0),(("hello","world"),3.0)]
ghci>M.lookup ("hello", "world") map
Just 3.0
于 2013-05-23T02:51:50.490 に答える