2013-11-10 3 views
3

Я студент-аспирант второго курса и только что начал изучать Haskell. Моя проблема связана с управлением типом и сопоставлением шаблонов. Я определил тип автомобиля, который содержит различные параметры и спецификации, если car's коробка палка или автоматическая, например, так:Haskell: тип против соответствия шаблону

data Car = Stick [Char] Integer | Automatic [Char] Integer 

Это решение работает блестяще для модели сопоставления автомобилей до сих пор, но теперь Мне нужна функция, которая берет автомобиль в качестве входного сигнала и возвращает информацию о Stick/Automatic, и не нужно менять управление Stick/Automatic на обработку строк. Я не знаю, какой тип возврата указывать для этой функции. Что это за тип возврата?

ответ

-6

В Haskell возвращаемый тип, который вы пишете в коде (в декларации), не для компилятора. Это вам. Компилятор определяет тип вашей функции, затем проверяет, правильно ли вы это сделали.

Что я предлагаю вам сделать, это сделать нужную вам функцию. (Я действительно не понял, что это должно быть.) После того, как вы это сделали, откройте ghci (компилятор, интерактивный), загрузите свой код. затем используйте: t, чтобы компилятор вычислил, какой тип он есть. Тогда вы можете записать его в декларации, если хотите. Это не обязательно.

$ ghci 
prelude> :load yourfile 
prelude> :t yourfunction 
+0

-1 тип умозаключение не является магическим, вам все равно нужно иметь представление о типе возврата – jozefg

+0

Вам не нужно писать тип вниз, но если вы не можете понять это самостоятельно, это означает, что вы действительно не знаете, что делает ваша программа. – Cubic

13

Вы можете ввести новый тип для типа Tranmission:

data TransmissionType = Stick | Automatic 

и изменить определение автомобиля для:

data Car = Car TransmissionType [Char] Integer 

Вы можете добавить функцию, чтобы получить тип

transmissionType :: Car -> TransmissionType 
transmissionType (Car t _ _) = t 

Поскольку у вас есть только один конструктор можно использовать вместо записи:

data Car = Car { 
    transmissionType :: TransmissionType, 
    field1 :: [Char], 
    field2 :: Integer 
} 

Если вы не хотите, чтобы изменить определение можно добавить функцию

isManual :: Car -> Bool 
isManual (Stick _ _) = True 
isManual (Automatic _ _) = False 
Смежные вопросы