2013-09-26 6 views
3

Предположим, что я создаю тип данных в haskell, и этот тип данных принимает несколько конструкторов. Есть ли простой способ определить позже в моем коде, какой он был создан как?Определение типов в Haskell

EDIT:

Пример, я использую DATATYPE

data LogicValue = CloseAnd (Int, Int) (Int, Int) 
      | CloseXor (Int, Int) (Int, Int) 
      | FarAnd LogicValue LogicValue 
      | FarXor LogicValue LogicValue 

Есть простой способ определить, если что-то является CloseAnd, например?

+0

Вы оба ответили в течение 20 секунд друг от друга .. Я хотел бы отметить, как вы оба верный. Маркировка leftaroundabout, потому что они были сначала волосами. – SwiftCore

ответ

9

Конечно, просто шаблон-совпадение имени конструктора!

f :: LogicValue -> Ret 
f (CloseAnd a b) = ... 
f (CloseXor a b) = ... 

То же самое, конечно, может быть сделано с помощью case переключателя.


Поскольку этот вопрос продолжает появляться в моем окне уведомлений (мой ответ имея голоса, это, если я честен, вероятно, не вполне заслуживает) Я хотел бы добавить, что ваша проблема не имеет ничего «определять типы». Различные конструкторы dataимеют одинаковый тип результата, а именно LogicValue. Вероятно, вы думаете о «подтипах» CloseAnd, CloseXor ..., как и в языке OO. Типы вариантов Haskell имеют некоторое сходство с иерархией классов OO, но они по-прежнему представляют собой другую концепцию.

5

используется для сопоставления с образцом, что:

logictype :: LogicValue -> [Char] 
logictype (CloseAnd _ _) = "It is a closeAnd." 
logictype (CloseXor _ _) = "It is a closeXor." 
logictype (FarAnd _ _) = "It is a FarAnd." 
logictype (FarXor _ _) = "It is a FarXor." 

Вы можете также соответствовать параметрам:

logictype (CloseAnd (a,b) (c,d)) = "it is a closeAnd with parameters " ++ show [a,b,c,d] 
Смежные вопросы