Использование экспортированных символов - PullRequest
3 голосов
/ 16 марта 2020

У меня есть Haskell файл с именем maxflow.hs, который экспортирует несколько символов

module MaxFlow 
(solveMaxFlow,MaxFlowNet,Vertex,Graph) where
import Data.List 


data Vertex = Vertex {
                          vertexLabel :: String
                        , vertexNeighbors :: [(String,Int)]
                        , vertexDistance :: Int
                        , vertexPredecessor :: String
                      } deriving (Show)

....

В этом же каталоге у меня есть другой файл с именем el elivination.hs, который пытается использовать один из этих символов

import MaxFlow

g =  [
                Vertex "0" [("1",16), ("2",13)         ] (maxBound::Int)  "",
                Vertex "1" [("2",10), ("3",12)  ] (maxBound::Int) "",
                Vertex "2" [("4",14) ,("1",4)        ] (maxBound::Int) ""    ,
                Vertex "3" [ ("5",20), ("2",9)] (maxBound::Int) ""      ,
                Vertex "4" [("5",4), ("3",7) ] (maxBound::Int) ""      ,
                Vertex "5" [ ] (maxBound::Int) ""    
      ]

Но по какой-то причине я не могу загрузить этот файл. Выполнение : l el elivination.hs

Я получаю

elimination.hs:4:17: error:
    Data constructor not in scope:
      Vertex :: [Char] -> [([Char], Integer)] -> Int -> [Char] -> a
  |
4 |                 Vertex "0" [("1",16), ("2",13)         ] (maxBound::Int)  "",
  |                 ^^^^^^

Возможно, мне не хватает чего-то очень базового c. Есть идеи ? Спасибо!

Ответы [ 2 ]

4 голосов
/ 16 марта 2020
module MaxFlow 
   (...,Vertex,...) where

Это говорит о том, что вы хотите экспортировать тип с именем Vertex, а не конструктор данных или поля. Вероятно, вам нужно либо экспортировать как тип данных, так и конструктор данных:

module MaxFlow (Vertex(Vertex)) where

Или экспортировать тип, все конструкторы данных и все поля:

module MaxFlow (Vertex(..)) where

Эти точки буквальные, а не короткие, вы можете ввести Vertex(..) в списке экспорта, чтобы обозначить тип, конструкторы данных и все поля.

3 голосов
/ 16 марта 2020

Вы экспортировали только конструктор типа, а не его конструктор (ы) данных. Если вы хотите экспортировать конструктор (и) данных, вы можете написать в скобках следующую запись:

module MaxFlow (solveMaxFlow, MaxFlowNet, Vertex<b>(Vertex)</b>, Graph) where

-- &hellip;

Если вы хотите экспортировать методы получения / установки, вы должны включить их в также скобки:

module MaxFlow (solveMaxFlow, MaxFlowNet, Vertex(Vertex<b>, vertexLabel, vertexNeighbors, vertexDistance, vertexPredecessor</b>), Graph) where

-- &hellip;

Вы можете написать две последовательные точки (..), если хотите экспортировать все:

module MaxFlow (solveMaxFlow, MaxFlowNet, Vertex(<b>..</b>), Graph) where

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