Я хотел бы построить тип, который бы соответствовал бы чему угодно, но никогда не использовался.Haskell: Как построить гетерогенный тип Любой
Пример:
type Any = forall a. a
f :: (x, Any) -> (Any, y) -> (x,y)
f (x,_) (_,y) = (x,y)
Это компилируется нормально с {-# LANGUAGE ImpredicativeTypes #-}
, но если я пытаюсь
f ("hi", 2) (3, (1, 2))
Я получаю ошибку:
<interactive>:19:9:
No instance for (Num a) arising from the literal `2'
Possible fix:
add (Num a) to the context of a type expected by the context: a
In the expression: 2
In the first argument of `f', namely `("hi", 2)'
In the expression: f ("hi", 2) (3, (1, 2))
<interactive>:19:13:
No instance for (Num a) arising from the literal `3'
Possible fix:
add (Num a) to the context of a type expected by the context: a
In the expression: 3
In the second argument of `f', namely `(3, (1, 2))'
In the expression: f ("hi", 2) (3, (1, 2))
Что бы хорошо, если я просто хотел x и y, чтобы быть Num, но то, что я планирую сделать с этим, должно быть намного более гибким, чем это. Я понимаю, что forall a. a
соответствует всем типам, но может передавать только тон, который никогда не может быть вычислен и снижен. Но у меня нет желания когда-либо заглядывать в «Любой».
Почему вы не можете использовать другую переменную типа 'z' вместо' Any'? – chaosmasttter
, потому что функция, которую я планирую использовать Any in, выглядит так: [(Any, x)] -> [(y, Any)] -> [(x, y)] на входе [(«a», 2) (3,4)] –
Это будет очень хрупким, я не уверен, зачем вам экзистенциальный Любой тип, если вы никогда не сможете использовать его для чего-либо конкретного. 'Data.Dynamic'' является предпочтительным способом обработки типов, которые неизвестны до выполнения. –