是否可以从评估环境中获取值?

时间:2014-10-14 11:59:00

标签: haskell

我在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 个答案:

答案 0 :(得分:4)

Haskell试图确保抽象不会中断。其中最重要的是"功能"抽象。这是整个界面:

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

其中~>表示"评估为"。

关键是你能够(道德地)对函数做的唯一事情是对它们应用值。你无法实现任何需要更多功能的杠杆作用。元编程等可以用来在语法之外的语法中实现 - 换句话说,你可以更多地利用非函数而不是语法来产生函数,但是在结束时你赢得的那一天还有很多事情可以继续。

最终,你可能可以达到你想要的效果,但像(\a -> (fun a, a))这样的东西真的是最好的方法。通常,Haskell中的事物比你最初期望的更明确。