Подсказка для чтения сигнатур функций в Haskell:
f :: a -> Bool
Это означает, что f
принимает один аргумент, который может быть что угодно , а f
не имеет никакой информации о типе. Так что f
не может знать, является ли аргумент Vegetable
. Есть только три возможных определения для f
(еще два для строгих / нестрогих вариантов, которые я опущу для ясности):
-- version 1
f _ = True
-- version 2
f _ = False
-- version 3
f _ = undefined
Видите ли, f
- очень скучная функция, потому что ей не разрешено ничего знать о ее параметре. Вы могли бы сделать что-то вроде этого:
isVegetable :: Typeable a => a -> Bool
isVegetable x = case cast x :: Maybe Vegetable of
Just _ -> True
Nothing -> False
Вам необходимо создать экземпляр Typeable
для Vegetable
,
data Vegetable = ... deriving Typeable
Подпись f :: Typeable a => a -> Bool
означает, что f
имеет один параметр, и он ничего не знает об этом параметре, за исключением того, что параметр имеет тип, известный во время выполнения.