Можно ли написать функцию в Haskell, который возвращает общий тип, когда:Generic функция результат в Haskell на основе некоторых предикатов
- в теле этой функции мы выводим в результате 2 отдельные виды
A
иB
(на основе некоторых вычислений) - типы
A
иB
имеют общийtype class
C
Позволяет увидеть пример кода. Контроллер типа ДОЛЖЕН быть в состоянии проверить, что этот код верен - функция test
выдает экземпляр типа A
или B
, поэтому мы можем выполнить f
на результат.
data A = A
data B = B
class C a where
f :: a -> Int
instance C A where
f x = 2
instance C B where
f x = 3
-- This function fails to compile:
-- I want something like:
-- test :: C a => Int -> a
test x = if x < 1
then A
else B
main = do
print $ f $ test 0
print $ f $ test 1
Я знаю, что это может выглядеть как анти-паттерн или что-то в этом роде, но я хочу знать ответ, потому что я люблю, чтобы проверить возможности Haskell, особенно когда речь идет о системе типа.
'текст :: С а => Int -> a' означает, что * вызывающий * получает выбрать тип' '- универсально количественно. Если вызываемый абонент выбирает, вам нужен экзистенциальный: 'data SomeC, где SomeC :: C a => a -> SomeC'. – luqui