Причина «Ошибки подписи недопустимого типа» мне непонятна

#haskell

Вопрос:

Я определил типы данных ниже:

   data Plan a = Empty | Road a a (Plan a) deriving(Eq, Show)
  data Town a = Emptytown | Town a  deriving(Eq, Show)
  town2 :: Town (Int, String)
  town2 = Town(1, "H")
  town3 :: Town (Int, String)
  town3 = Town(2, "S")
 

Но я не понимаю, почему я получаю следующую ошибку, когда пытаюсь определить Plan2 :

   Plan2 :: Plan Town (Int, String)
  Plan2 = Road town2 town3 (Empty)``
  
  <interactive>:456:1: error:
  Invalid type signature: Plan2 :: ...
  Should be of form <variable> :: <type>
 

Комментарии:

1. Вы не должны использовать заглавную букву P для Plan2, так как это указывает на то, что он является конструктором данных

Ответ №1:

Существует множество проблем:

  • Имена переменных должны начинаться со строчной буквы, но Plan2 начинаться с прописной буквы
  • В подписи типа для plan2 вас указаны Plan два аргумента типа, но ожидается только один. Я думаю, что вы хотите предоставить Town один аргумент типа, а затем предоставить его в качестве аргумента типа Plan
     plan2 :: Plan (Town (Int, String))
     
  • В конце определения есть две обратные ссылки для Plan2 . их следует удалить.