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中的类型转换函数中嵌入了
所以
第三,如果可以,尝试使用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)) |
如果键入
1 | fact 4 = 24 |
我不知道F中是否有等同于
试图坚持f_样式而不在c_和f_之间跳来跳去的原因是其他读者和您自己可能会感到困惑,因为这可能会使代码的可读性降低。
既然两者都是:
1 | somevalue |> int |
和
1 | System.Int32.Parse somevalue |
对无效输入抛出异常是否最好防止应用程序在运行时爆炸?
因为我找不到任何返回
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" |
(按照古斯塔沃的建议使用胰蛋白酶)