如何在F#中的函数中使用用户输入的值?

How can I use a user inputted value in my Function in F#

所以我尝试在f中创建一个简单的阶乘函数,它使用用户输入的值(使用控制台,我不知道这是否有任何区别),但是我似乎找不到任何解决方案来使用我函数中用户的值。

1
2
3
4
5
6
7
8
    open System

    let rec fact x =
        if x < 1 then 1
        else x * fact (x - 1)

    let input = Console.ReadLine()
    Console.WriteLine(fact input)

它经常给我一个错误,说"这个表达式应该有类型"int",但这里有类型"string"。如果有人知道如何使它正常工作(或者至少可以告诉我需要做什么来将我的用户输入值转换成一个int,那将非常感谢。

谢谢你的帮助。


f不自动转换,因此需要分析字符串:

1
2
3
4
5
6
7
8
open System

let rec fact x =
    if x < 1 then 1
    else x * fact (x - 1)

let input = Console.ReadLine()
Console.WriteLine(fact (Int32.Parse input))

理论上,您需要将其转换回字符串以打印它,但它可以工作,因为console.writeline有一个重载,它接受一个整数并进行转换。


我的建议是尝试使用f函数,除非没有等价的f函数。

其次,F中的类型转换函数中嵌入了System.(type).(Try)Parse。"这里的Try是可选的,type是任何数字类型,如int8…、int64float32和float。(最后一个是64位)

所以int"123" = System.Int32.Parse("123")是真的。这两个功能是等效的。这也适用于浮点数。

第三,如果可以,尝试使用tail递归:

1
2
3
4
5
6
7
8
let fact n =
  let rec help acc = function
    | n when n <= 0 -> acc
    | n             -> help (acc*n) (n-1)
  help 1 n

let input = System.Console.ReadLine()
printfn"fact %s = %d" input (fact (int input))

如果键入4,然后按Enter键,输出将为:

1
fact 4 = 24

我不知道F中是否有等同于ReadLine的内容。我找不到。

试图坚持f_样式而不在c_和f_之间跳来跳去的原因是其他读者和您自己可能会感到困惑,因为这可能会使代码的可读性降低。


既然两者都是:

1
somevalue |> int

1
System.Int32.Parse somevalue

对无效输入抛出异常是否最好防止应用程序在运行时爆炸?

因为我找不到任何返回int option的函数,所以我写了一个:

1
2
3
4
5
6
7
8
let asInt32 numberString =
  let (success,num)  =
    System.Int32.TryParse(numberString)
  if success then
    Some num
  else
    None
asInt32"22"

(按照古斯塔沃的建议使用胰蛋白酶)