对于我正在编写的工具(http://hackage.haskell.org/package/explore),我需要一种在运行时读取haskell函数定义的方法,将它们应用于我的工具中的值并检索其应用程序的结果.
任何人都可以使用GHC(6.10.4或6.12.1)API给我一个非常基本的例子吗?
要在运行时从文件中读取的示例函数定义:
f x = 10**(4/1102*x - 1)
Run Code Online (Sandbox Code Playgroud)
预期的计划产出
--mapM_ print $ map f [428, 410, 389]
3.577165388142748
3.077536885227335
2.5821307011665815
Run Code Online (Sandbox Code Playgroud)
!! UPDATE!
我发布了一个快速回答,但它在执行目录中创建了一个目标文件,任何提示都可以避免这种情况并避免使用所有文件IO.我还希望看到一个在内存中执行所有操作的版本:例如,用户在GUI中提供函数定义,编译/评估不会创建任何目标文件.
我通过使用书中的一个例子来描述这个问题.
在Simon Thompson的书"HASKELL函数式编程工艺"(第82页)(见下图)中显示了评估步骤fac 4.
题:
是否可以使用某些工具或一些"Haskell调试器"来写出GHCi在评估其价值时使用的评估步骤fac 4?
优选地,以人类可读的格式,用于教育和学习目的.
对每个评估步骤进行一些自动解释也是很好的,例如在重写步骤中使用了哪个等式.
我的主要目的是更深入地了解在运行简单的教育Haskell示例程序(如fac)时如何执行重写步骤.
有没有办法做到这一点 ?如果有,怎么样?


我想知道什么是需要的电话.
虽然我在维基百科搜索并在此处找到它:http://en.wikipedia.org/wiki/Evaluation_strategy,但无法正确理解.如果有人可以用一个例子来解释并指出与按值调用的差异,那将是一个很大的帮助.
evaluation programming-languages evaluation-strategy call-by-value call-by-need
我试图从文档中获取一些信息,但似乎它是那些你需要检查并使用它来解决问题的项目之一...
我注意到邮件列表中的高活动和很多提交,这是一个好兆头.但是当我查看代码库(btw 536MB大 - 不是一个好兆头)时,我没有找到太多的J2EE应用程序时尚.没有spring,ejb,奇怪的文件夹结构,相当多的非标准jar库.这就像开发人员不喜欢它所以他们以自己的方式做事:-)
我一直在使用一些类似的平台,主要是门户网站,例如Liferay很容易使用,因为它看起来像人们期望的那样.它基于Spring,它具有透明的服务和dao层,它具有简单的插件架构(plugin = WAR)等,是典型的J2EE开发.
我想知道开发人员在决定使用它之前应该注意哪些关键方面.由于它是非标准的J2EE应用程序,因此需要花费多少时间来了解它才能提高工作效率.
与OpenBravo等其他ERP系统相比,它有哪些(dis)优势.如果我主要需要Cart而不是ERP后端,我应该对OpenTaps感兴趣吗?
首先十分感谢.
我不明白Call-by-name和Call-by-need之间的差异.据我所知,Call-by-need方法恢复了返回的答案.但它如何帮助我们,结果之间是否存在根本差异?
例如,
begin integer n;
procedure foo(e, n);
integer e, n;
begin
for n := 1 step 1 until 10 do begin
prints(`;;; the value of e is ');
printnln(e)
end
end;
foo(2 * n, n)
end
Run Code Online (Sandbox Code Playgroud)
因此,按照我的理解,在按名称呼叫时,我们将获得:
;;; the value of e is 2
;;; the value of e is 4
;;; the value of e is 8
Run Code Online (Sandbox Code Playgroud)
等等.这是因为我们通过2*n对e,并e与新的评估i每次.在需要召唤时会发生什么?
根据ISO C11 - 6.5.16.3,它说
- 赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.
所以我想这意味着,例如,
int x = 10;
x = 5 + 10;
Run Code Online (Sandbox Code Playgroud)
x计算为10,右操作数计算为15.x.但是如果赋值的目的是存储右操作数的evalauted值(就像在step2中那样),为什么左操作数的评估是必要的?评估左操作数有什么意义?
我刚刚使用scikit-learn创建了一个模型,该模型估计了客户对某些优惠的响应可能性.现在我正在尝试评估我的模型.为此,我想绘制升力图.我理解lift的概念,但我很难理解如何在python中实际实现它.
通过在C#中引入Null-Conditional运算符,进行以下评估,
if (instance != null && instance.Val != 0)
Run Code Online (Sandbox Code Playgroud)
如果我这样改写,
if (instance?.Val != 0)
Run Code Online (Sandbox Code Playgroud)
如果instance是null引用,它将被计算为true ; 它表现得像
if (instance == null || instance.Val != 0)
Run Code Online (Sandbox Code Playgroud)
那么使用这种新语法重写评估的正确方法是什么?
编辑:
instance是一个从JSON反序列化的大对象的字段.有很多这样的代码,首先检查字段是否在JSON中,如果是,检查Val属性是否不等于常量,只有两个条件都为真,做一些操作.
该代码本身可以被重构,使逻辑流程更加"决策意识"由彼得在他的评论中指出,虽然在这个问题上,我感兴趣的是如何使用null-conditional operators与!=.
在另一个问题的接受答案中,在运行时设置Clojure"常量",使用clojure函数constantly.
constantly看起来像这样的定义:
(defn constantly
"Returns a function that takes any number of arguments and returns x."
{:added "1.0"}
[x] (fn [& args] x))
Run Code Online (Sandbox Code Playgroud)
文档字符串说明了它的作用但不是为什么会使用它.
在上一个问题中给出的答案中,常常使用如下:
(declare version)
(defn -main
[& args]
(alter-var-root #'version (constantly (-> ...)))
(do-stuff))
Run Code Online (Sandbox Code Playgroud)
因此,不断返回的函数直接评估其结果.我很困惑这是如何有用的.我可能不理解如何x在"不断"包装中进行评估.
我什么时候应该使用constantly,为什么有必要?