Можно ли использовать ценность из контекста оценки?

У меня есть следующая примерная программа в Haskell:

fun 1 = "result1" 
fun 2 = "result2"

wrap = (\ x -> (\ _ -> fun x))

main = map wrap [1,2]

который дает

[test.wrap._#lambda1._#lambda2 1,test.wrap._#lambda1._#lambda2 2]

результат.

Возможно ли получить переменную (например, 1 или 2) из сохраненного контекста, а не хранить ее отдельно, как:

wrap = (\ x -> (\ _ -> (fun x,x)))

Я полагаю, что требуется какая-то метапрограммирующая магия?

1 ответ

Haskell пытается обеспечить, чтобы абстракции не нарушались. Главным среди них является "функция" абстракции. Вот весь интерфейс:

f :: a -> b x :: a f ~> (\q -> E) x ~> a
 --------------------------- ------------------------------
 f x :: b f x ~> E[q\a]

где ~> означает "оценивается".

Дело в том, что единственное, что вы можете (морально) делать с функциями, - это применять к ним значения. Вы не можете достичь чего-либо, что требует большего влияния на функции, чем это. Метапрограммирование и т.д. Можно использовать для синтаксического синтаксиса вне этого поля - другими словами, вы можете получить больше рычагов влияния на не функции, а вместо этого синтаксис, который приводит к функциям, но в конце дня у вас не будет многое еще нужно.

В конечном счете, вы, вероятно, можете достичь того, чего хотите, но, возможно, что-то вроде (\a → (fun a, a)) действительно лучший способ обойти это. Часто вещи в Haskell более явны, чем вы можете изначально ожидать.

licensed under cc by-sa 3.0 with attribution.