GADT для полиморфного списка

Я разбираю несколько операторов формы

v1 = expression1
v2 = expression2
...

Я используя State Monad, и мое состояние должно быть парой (String, Expr a), я действительно настаиваю на том, чтобы выражения были напечатаны. Я попытался реализовать состояние как [PPair], где я определяю PPair с помощью GADT:

data PPair where
    PPair :: (String, Expr a) -> PPair

После того, как эта строка прошла компилятор, я почувствовал, что делаю что-то действительно неправильное. Я подавил эту мысль и продолжил кодировать. Когда я пришел к написанию кода, который извлекает значение переменной из состояния, я осознал проблему:

evalVar k ((PPair (kk, v)):s) = if k == kk then v else evalVar k s

Я получаю:

Inferred type is less polymorphic than expected

, что вполне ожидаемо. Как мне обойти эту проблему? Я знаю, что могу решить эту проблему, разбив тип на все типы кандидатов a, но нет ли более аккуратного способа?

5
задан aelguindy 20 January 2012 в 17:31
поделиться