Как преобразовать что-то в String в Haskell внутри функции - PullRequest
1 голос
/ 10 октября 2019

Я действительно нуб в Хаскеле, и я застрял в глупой функции уже несколько дней. Итак, у меня есть домашнее задание, и учитель хочет, чтобы мы только модифицировали функции этого экземпляра модуля graphviz. Я пытался реализовать первую функцию, но я не смог преобразовать идентификатор в строку (вы поймете почему, увидев модуль graphviz)

-- | Converts a graph to Graphviz
--
-- >>> putStrLn $ graphvizString $ addArcs emptyGraph [(1,2),(2,3),(1,3)]
-- digraph {
--     1 [label="1"];
--     2 [label="2"];
--     3 [label="3"];
--     1 -> 2;
--     1 -> 3;
--     2 -> 3;
-- }
-- ...
instance (Show v, Ord v) => Graphviz (Graph v) where
    graphvizNodesList (Graph arcs labels styles) = [(id,label,style) | id<-keys, label<-(elems labels), style<-(elems styles)]
    graphvizArcsList g = 

Вот контекст, потому что домашняя работа довольно большая, поэтомуизвините, если кода много .. Это только для контекста. Моя проблема только там в этом случае. Итак, это мой график (в модуле Graph.hs):

import Data.Map (Map,empty,member,insert,keys,findWithDefault,assocs ,fromList,(!),union,mapWithKey,toList,elems)
import Graphviz 

-- | A directed graph
data Graph v = Graph
    { arcsMap :: Map v [v]     -- A map associating a vertex with its successors
    , labelMap :: Map v String -- The Graphviz label of each node
    , styleMap :: Map v String -- The Graphviz style of each node
    }
...
Some functions implemented here not important
...

А это модуль graphviz (Graphviz.hs)

...
blabla
...
-- | A triple @(id,label,style)@ where
--
-- * @id@ is the key identifying the node (must be unique)
-- * @label@ is any string compatible with Graphviz
-- * @style@ is any string describing the Graphviz style of the node
type GraphvizNode = (String, String, String)

-- | A triple @(id1,id2,label)@ where
--
-- * @id1@ is the key of the source vertex
-- * @id2@ is the key of the target vertex
-- * @label@ is the label of the arc
type GraphvizArc = (String, String, String)

-- | Class of types that can be converted to Graphviz strings
class Graphviz g where

    -- | The list of Graphviz nodes
    --
    -- It returns a list of all nodes of the graph, indicating the label and
    -- the style of each node.
    graphvizNodesList :: g -> [GraphvizNode]

    -- | The list of Graphviz arcs
    --
    -- It returns a list of all arcs of the graph, indicating the label of the
    -- arc.
    graphvizArcsList :: g -> [GraphvizArc]

    -- | The header of the Graphviz string
    --
    -- This is the string printed before writing the nodes and the arcs.
    graphvizHeader :: g -> String
    graphvizHeader _ = "digraph {\n"

blablablabla...

Опять же, извините за все этокод, который я считаю необходимым понять, что я не понимаю.

Мой вопрос прост: как я могу реализовать graphvizNodesList, поскольку id не является строкой ??? Как я могу преобразовать его, чтобы он мог поместиться в моей функции graphviz.

Большое спасибо и извините

1 Ответ

1 голос
/ 10 октября 2019
graphvizNodesList (Graph arcs labels styles) = [(id,label,style) | id<-keys, label<-(elems labels), style<-(elems styles)]

keys здесь имеет тип Map k a -> [k] (т.е. это функция), но в этом контексте ожидается, что он будет иметь тип [a] (т.е. список). Вам необходимо применить функцию keys к Map, чтобы получить ключи от этой карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...