我在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)))
我认为需要一些元编程魔法?
答案 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中的事物比你最初期望的更明确。