F#调用带整数并返回字符串的函数时出现问题

时间:2018-09-22 12:37:44

标签: f#

我对使用F#编程非常陌生,目前我正在开发一个项目,该函数带有一个整数并返回一个字符串值。 我的问题(下面是我的代码)是,无论我做什么,我都无法返回str的值,调用函数。

let mulTable (n:int):string = string n
let mutable m = 1
let mutable str = ""

while m < 10 do
    str <- "m\t" + str
    m <- m + 1
printfn "%A" (mulTable str)

我的想法是,我想将m的值存储在str中,以便在while循环的末尾str中包含“ 1 2 3 4 5 6 7 8 9”的值。但是无论我尝试什么printfn“%A” mulTable str,都返回“该表达式被认为具有int类型,但是这里具有string类型”。我尝试将我的str转换为可变值的字符串,例如:

let mutable str = ""
let mutable str1 = str |> int

然后我尝试使用mulTable函数而不是str来调用我的str1。但这仍然行不通。

我在这里想念什么?我一直在尝试我能想到的每一种可能的解决方案,但无法解决我的问题。

3 个答案:

答案 0 :(得分:1)

您自己的算法的修复方法可能是:

let getSequenceAsString max =
    let concat s x = sprintf "%s\t%i" s x
    let mutable m = 1
    let mutable str = ""

    while m < max do
        str <- concat str m
        m <- m + 1
    str
printfn "%A" (getSequenceAsString 10)

但是正如其他人所表明的,很多工作可以更轻松地完成:

open System
let getSequenceAsString max = 
    String.Join("\t", [1..max-1])

如果您希望每个数字都按注释要求还原,则可以通过以下方式完成:

let getSequenceAsString min max = 

    let revert x = 
        let rec rev y acc =
            match y with
            | 0 -> acc
            | _ -> rev (y / 10) (sprintf "%s%i" acc (y % 10))
        rev x ""

    String.Join("\t", ([min..max-1] |> List.map revert))

printfn "%A" (getSequenceAsString 95 105)

Gives: 
"59     69      79      89      99      001     101     201     301     401"

答案 1 :(得分:0)

我已经调整了代码,以使其产生与您想要的结果相似的结果:

let mulTable (n:int):string = string n
let mutable m = 1
let mutable str = ""

while m < 10 do
    str <- mulTable m+ "\t" + str
    m <- m + 1
printfn "%A" (str)

我已使用您的mulTablem转换为字符串,但是对于printfn则不需要使用它,因为str已经是字符串。 结果仍然是9 8 7 6 5 4 3 2 1

有多种方法可以还原字符串,其中一种方法是将字符串拆分为字符数组,然后还原该数组。从结果数组中,我们将再次构建一个新字符串。看起来像这样:

printf "%A" (new System.String(str.ToCharArray() |> Array.rev ))

修改

要获得相同的结果,我建议使用更多的函数样式,使用递归并避免变异变量。

let getNumbersString upperLimit = 
    let rec innerRecursion rem acc=
        match rem with
            | 0 -> acc
            | _ -> innerRecursion (rem-1) (sprintf "%i "rem::acc)
    innerRecursion upperLimit [] |> String.concat ""

getNumbersString 9

将导致 val it : string = "1 2 3 4 5 6 7 8 9 "

答案 2 :(得分:0)

您可以轻松地将字符串数组连接到字符串数组中,然后在必要时将其打印出来。

open System

let xs = [1..9] |> List.map string 
//you should avoid using mutable variables, and instead generate your list of numbers with an list comprehension or something similar.
String.Join("\t", xs) 
//A little exploration of the List/Array/String classes will bring this method up: "concatenates the members of a collection using the separator string.

这给了我

  

val it:字符串=“ 1 2 3 4 5 6 7 8 9”