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

F# 调用接受整数并返回字符串的函数时出现问题,f#,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 st

我对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)
然后我尝试使用mulTable函数调用str1,而不是调用str。但它仍然不起作用


我错过了什么?我一直在尝试我能想到的每一种可能的解决方案,但却无法解决我的问题。

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

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)
编辑

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

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”
您可以轻松地将字符串数组加入到字符串数组中,然后在必要时将其打印出来

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:string=“1 2 3 4 5 6 7 8 9”


您自己的算法的修复程序可以是:

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)

如果您希望回复您在评论中要求的每个号码,可以通过以下方式进行:

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"

mulTable接受一个int,但您要将str传递给它。str是一个字符串,不是一个int。是的,到目前为止我已经计算过:-)我试图通过使用一个新值str1来解决这个问题,该值取str的值并将其转换为int。但是当我尝试在str1上使用mulTable时(现在包含转换为int的str),它仍然不起作用。它返回:未处理的异常:System.FormatException:输入字符串的格式不正确,即使我现在使用的输入实际上是一个整数,并且现在满足我的函数mulTable。不能将空字符串转换为整数。你期望的价值是什么?如果必须,请尝试使用“0”初始化它。在我看来,您一直存在的问题是,您正在字符串中写入m,并希望它在str中生成一个整数值。恐怕不会,您只需返回字母m即可。试试类似于
str的方法,这很有意义。谢谢,有没有办法反转这些值,使其返回1>9而不是9>1?好吧,假设我想增加输入,使其返回1-10,然后将数字反转,使其返回:1 2 3 4 5 6 7 8 9 01。让我们说,我希望它是打印在最低到最高的顺序。我可能会使用上面的反转符号让你有点不舒服:-)请检查我的最新更新。我向您展示的函数可以轻松处理任何数字范围。我没有提供最低限度,但如果您了解它是如何工作的,您将很容易采用它;)好的,非常感谢您的帮助:-)我可能会坚持使用第一个解决方案,现在只使用str+“\t”+mulTable str。由于我是编程新手,你的另一个解决方案似乎有点复杂,而到目前为止,我只处理过F#中非常基本的特性。有一个愉快的周末!
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"