我对使用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。但这仍然行不通。
我在这里想念什么?我一直在尝试我能想到的每一种可能的解决方案,但无法解决我的问题。
答案 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)
我已使用您的mulTable
将m
转换为字符串,但是对于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”