Я разбираю несколько операторов формы
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, но нет ли более аккуратного способа?