Подтвердить что ты не робот

Не встроенный конструктор данных

У меня есть два файла .hs: один содержит замедление нового типа, а другой использует его

first.hs:

module first () where
    type S = SetType
    data SetType = S[Integer]  

second.hs:

module second () where
    import first 

Когда я запускаю second.hs, оба модуля сначала, а второй загружаются просто отлично Но когда я пишу :type на платформе Haskell, появляется следующая ошибка

Not in scope : data constructor 'S'

Примечание. В каждом модуле есть определенные функции, я просто пропущу его для      ясность вопроса

4b9b3361

Ответ 1

module first () where

Предполагая, что в действительности имя модуля начинается с буквы верхнего регистра, как и должно быть, пустого списка экспорта - () - говорит, что модуль ничего не экспортирует, поэтому вещи, определенные в First, не находятся в scope в Second.

Полностью опустить список экспорта для экспорта всех привязок верхнего уровня или перечислить экспортированные объекты в списке экспорта

module First (S, SetType(..)) where

((..) экспортирует также конструкторы SetType, без этого, будет экспортирован только тип).

И используйте как

module Second where

import First

foo :: SetType
foo = S [1 .. 10]

Вы также можете отступать на верхний уровень,

module Second where

    import First

    foo :: SetType
    foo = S [1 .. 10]

но это является уродливым, и можно получить ошибки из-за ошибочного изъятия отступа.

Ответ 2

  • Имена модулей начинаются с капитала - Haskell чувствителен к регистру
  • Выровняйте свой код в левом поле - макет имеет важное значение в Haskell.
  • Бит в скобках - это список экспорта - пропустите его, если вы хотите экспортировать все функции или поместить все, что вы хотите экспортировать в нем.

First.hs:

module First where

type S = SetType
data SetType = S[Integer] 

Second.hs:

module Second where
import First