在F#中读取未知行数的文本

6

假设我有 n 个(在本例中为 7)给定的输入:

10

20

30

40

50

60

70

如何读取所有输入并将它们存储在列表/数组中?

我尝试了以下代码:

let inputList = [
    while (let line = Console.ReadLine()) <> null do
        line |> int
]

这个想法是读取直到我得到一个空行。
但我遇到了以下错误:

这个“let”后面的块未完成。需要一个表达式。


1
这个对我来说看起来像是你试图将一些C#代码翻译成F#。你可能需要一个F#教程,这个链接里的教程:http://en.wikibooks.org/wiki/F_Sharp_Programming/Control_Flow 包含了你所需的大约90%的内容。 - John Palmer
1个回答

12

要以函数式风格完成这个任务,你可以使用Seq.initInfinite从控制台创建一个序列。 然后,您需要使用Seq.takeWhile在获取null值时终止此列表。 除此之外,您可以使用所有可用的Seq模块函数,包括Seq.toList

let read _ = Console.ReadLine()
let isValid = function null -> false | _ -> true
let inputList = Seq.initInfinite read |> Seq.takeWhile isValid |> Seq.toList

正如我在答案中所说,与 null 进行比较是行不通的。此外,您需要添加 Seq.map 来将其转换为整数。 - Gus
@Gustavo 如果按下 CTRL+ZConsole.ReadLine() 将返回 null。我只能假设这是 OP 的意图;否则,可以在匹配表达式中添加一个空字符串子句。 - Tim Rogers
1
是的,那只是一个小细节,我认为更好的选择是使用System.String.IsNullOrEmpty,这样你就可以同时处理两种情况。 - Gus

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