F# 中等价于 Haskell 的 "interact" 函数的是什么?

8

我刚刚了解一下Haskell,看到它的方法interact可以实现从stdin读取输入、将函数应用于字符串并将结果写回stdout的常见模式。例如:

interact (map toUpper)

将输入的所有内容转换为大写并输出。

F#/.Net中是否已有相应的功能?

1个回答

6

这个功能本身并不存在,但实现它很容易:

let inline interact f =
    printfn "%s" (f (System.Console.Readline()))

嗯,如果你忽略interact使用的惰性IO这一事实,那就很接近了。惰性IO并不总是一个好主意,但对于那个问题它还算可以。 - Carl
1
懒惰 IO 实际上是 interact 能够按照其方式工作的关键部分 - 它可以提前终止,可以在接收输入时立即给出反馈(注意缓冲),等等。与纯计算不同,懒惰 IO 实际上以其他方式可见,而不仅仅是终止属性。(这就是为什么它经常被认为是一个坏主意的原因。) - Carl
1
@PCB 通过读取所有输入并将其作为单个字符串传递给函数,您可以更接近“交互”。但这会失去所有“交互”的惰性属性,这些属性使其能够在生成输出或在读取所有输入之前终止。 - Carl
1
@PCB 如果将函数传递给“互动(interact)”并返回一个惰性字符流,那么您将获得相同的行为。然后,当需要时,它可以从stdin中读取更多内容。这基本上就是interact所做的事情,只不过惰性字符流是标准的“String”类型。 - Carl
4
这个F#片段演示了使用Seq.initInfinite懒惰地从控制台读取数据,并且可能与你想要的接近。它用10行F#创建了一个最小的销售点应用程序。 - Phillip Trelford
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接