如何进行序列评估?

时间:2015-12-01 15:41:05

标签: f#

我正在研究我对F#的了解以及我反复遇到的一个问题是在尝试创建函数时,如果我使用Sequence太接近最终结果我最终会打印出来的签名函数而不是输出。

示例:

[<EntryPoint>]
let main argv = 
    let consoleInput = Seq.initInfinite (fun _ -> System.Console.ReadLine())

    let isEmpty str = (not (str = System.Environment.NewLine)) && (not (str = "")) && (not (str = null))

    let inputs = consoleInput |> 
        Seq.takeWhile isEmpty |> 
        Seq.map (fun str -> System.Convert.ToInt32(str))

    let makeAbsolute lst = Seq.map (fun x -> abs x)

    let values = makeAbsolute inputs

    printfn "%A" values

    0 // return an integer exit code

所有这一切应该是接受N个输入并输出它们作为绝对值。但最后它打印出函数签名 - 。

我不想仅仅为了评估序列而调用Seq.toList,因为它似乎不优雅,所以有正确的方式&#39;做这种事情?

编辑:除了我非常厚颜无耻地使用&#39; inelegance&#39;之外,我还希望尽可能保持函数的通用性(只是一种由resharper使用和我的开发风格产生的习惯),并且使用tolist是使功能更具体&#39;我想避免。

1 个答案:

答案 0 :(得分:3)

您实际上并未使用序列参数调用Seq.mapmakeAbsolute函数会使用参数lst,但不对其执行任何操作。

将序列赋予函数,它将评估结果。

let makeAbsolute lst = Seq.map (fun x -> abs x) lst

请注意,您还可以将其简化为:

let makeAbsolute lst = Seq.map (abs) lst