从for console中读取字符串而不是for循环

时间:2016-06-19 17:48:23

标签: f#

是否有任何优雅的功能方式从控制台输入读取N个字符串? F# for fun and profit建议避免使用for循环,因此我使用了递归,但它看起来很丑陋而且很长。

代码描述:我需要从控制台读取几个字符串(在控制台的第一行输入中指定确切的数字),连接它们并转换为整数数组。

let rec recReadline n =
    match n with
        | 0 -> ""
        | _ -> let x = n - 1
               " " + Console.ReadLine() + recReadline x 

let getArrayOfIntFromConsole = 
    let x = Console.ReadLine() |> int |> recReadline
    let trimmedString = x.Trim()
    let numArray = trimmedString.Split ' ' |> Array.map(int)
    numArray

我正在学习f#,抱歉没有问题。

UPDATE1

感谢您的回复!这是来自黑客级别的任务:https://www.hackerrank.com/challenges/diagonal-difference。起初我决定分离输入和算法逻辑并创建这篇文章。我不清楚描述问题的上下文,并建议使用Array.Init。它没有帮助我,因为输入字符串由许多由空格分隔的整数组成。我用Array.Init标记了一个回复作为正确的答案,因为这是我的糟糕表达问题的正确答案。

我决定在一个函数中读取控制台和计算,它对我有用。 我的最终代码:

open System

let rec recDiagDif recCounter primaryDiagSum secondDiagSum =
    match recCounter with
        | 0 -> primaryDiagSum - secondDiagSum |> abs
        | _ -> let arrayInt = Console.ReadLine().Split ' ' |> Array.map(int)
               recDiagDif (recCounter-1)
                          (primaryDiagSum + arrayInt.[arrayInt.Length - recCounter])
                          (secondDiagSum + arrayInt.[recCounter-1])

[<EntryPoint>]
let main argv =
    let matrixSize = Console.ReadLine() |> int
    printf "%A" (recDiagDif matrixSize 0 0)
    0

如果您知道如何改进代码,请随时发表评论。

3 个答案:

答案 0 :(得分:4)

我倾向于建议将控制台输入保持为某种集合,而不是转换为扁平字符串,然后再在空白处拆分。

let readNLines n =  Array.init n (fun _ -> Console.ReadLine())

let getArrayOfIntFromConsole() = 
    let lines = Console.ReadLine() |> int |> readNLines
    let numArray = lines |> Array.map(int)
    numArray

答案 1 :(得分:3)

你可以这样做:

open System

let getArrayOfIntFromConsole () = 
    let readLines n = Array.init n (fun _ -> System.Console.ReadLine ())
    Console.ReadLine () |> int |> readLines |> Array.map int

演示(FSI):

> getArrayOfIntFromConsole ();;
3
1
42
1337
val it : int [] = [|1; 42; 1337|]

答案 2 :(得分:1)

你可以创建一个从Console.ReadLine馈送的无限序列,并且只需要获取第一个n元素

let readNStrings n =                       
    fun _ -> Console.ReadLine()
    |> Seq.initInfinite
    |> Seq.take n