我正在研究我对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;我想避免。
答案 0 :(得分:3)
您实际上并未使用序列参数调用Seq.map
,makeAbsolute
函数会使用参数lst
,但不对其执行任何操作。
将序列赋予函数,它将评估结果。
let makeAbsolute lst = Seq.map (fun x -> abs x) lst
请注意,您还可以将其简化为:
let makeAbsolute lst = Seq.map (abs) lst