【发布时间】:2013-10-16 12:51:02
【问题描述】:
当我使用 JS 时,我有两个选项来处理一个函数。
var a = function() {};
var b = a; // b is the function a itself.
var c = a(); // c is result of the evaluation of function a.
AFAIK,Haskell 默认是懒惰的,所以我总是默认得到b。但是如果我想得到c,我该怎么办?
更新
我想我应该明确地写一个词。
我在ghci 中做了类似的事情。
let a = getLine
a
我想让getLine 的结果变成a。
更新2
我记下这段代码,以供像我这样的人以后参考。
在@Ankur 的帮助下,我可以更正对 Haskell 的翻译。
上面的代码示例不是一个好的示例,因为函数 a 不返回任何内容。
如果我这样改变它;
var a = function(x,y) { return x * y; };
var b = a; // b is the function a itself.
var c = a(); // c is result of the evaluation of function a.
翻译成Haskell会变成这样。
let a = \ x y -> x* y // Anonymous lambda function.
let b = a
let c = a 100 200
【问题讨论】:
-
您可能想要一个字符串,但
getline的类型为IO String。 IO 是一种特殊的盒子,你可以把东西放进去,但永远无法取回。你需要阅读 Haskell monadic I/O system。 -
@n.m.
you can put stuff inside but cannot get it back, ever这是不正确的。应该是:您必须在框的上下文中工作才能使用框内的值。 -
@Ankur 你是这样说的,是的。有点我不打算提供 monad 教程。
-
感谢您的讨论,但无论如何,像这样的基本示例对像我这样的初学者更有价值和有帮助。我只是希望我最终能理解 Monad 是什么。
-
请注意,由于在 Haskell 中所有函数都在 curried form 中,因此 JavaScript 函数
function(x,y) { return x*y; }将转换为\(x,y) -> x * y。 Haskell 函数\x y -> x * y将是function(x) { return function(y) { return x*y; } }。
标签: haskell evaluation strict