2010-11-25 4 views
2

Я все еще только изучаю основы Haskell, и я попытался найти ответ на этот простой вопрос, поэтому заранее извиняюсь, потому что я уверен, что это просто.Сравнение типов в Haskell

Дано:

data Fruit = Fruit| Apple | Orange 
    deriving (Show, Eq) 

a = Apple 

Как проверить, если какой-то а есть фрукты?

+0

Я был бы заинтересован в зная, почему вы этого хотите. – sclv 2010-11-25 19:43:17

+0

@sclv: Учитывая указанную выше программу, Apple возвращает True. a == Фрукты возвращаются False. Я просто хочу знать, как я говорю, является ли какая-то переменная плодом. Ничего сложного. Apple == Fruit также возвращает false. Возможно, это запутанно, потому что конструктор данных и типов имеет одно и то же имя. Хорошо, поэтому замените данные Fruit на данные FruitType ..., я до сих пор не могу найти способ сделать какой-то контроль, связанный с FruitType. – 2010-11-25 21:34:46

ответ

9

Предполагая, что вы действительно имели в виду тип сравнение, простой ответ «вы не можете». Haskell статически типизирован, поэтому проверка выполняется во время компиляции, а не во время выполнения. Так что, если у вас есть функция, как это:

foo :: Fruit -> Bool 
foo Apple = True 
foo x  = False 

Ответ или нет x плод всегда будет «да».

Возможно, вы пытаетесь выяснить, с какими конструкторами данных было построено заданное значение. Чтобы сделать это, используйте поиск по шаблону:

fruitName :: Fruit -> String 
fruitName Fruit = "Fruit" 
fruitName Apple = "Apple" 
fruitName Orange = "Orange" 

Кстати, если вы используете GHCI, и вы хотите знать, тип чего-либо, используйте :t

> let a = 123 
> :t a 
a :: Integer 
> 
Смежные вопросы