F# 如何在F中的函数中使用用户输入的值#
因此,我试图在F#中创建一个简单的阶乘函数,它使用用户输入的值(使用控制台,我不知道这是否有任何区别),但我似乎找不到任何解决方案,可以在函数中使用用户输入的值F# 如何在F中的函数中使用用户输入的值#,f#,user-input,factorial,F#,User Input,Factorial,因此,我试图在F#中创建一个简单的阶乘函数,它使用用户输入的值(使用控制台,我不知道这是否有任何区别),但我似乎找不到任何解决方案,可以在函数中使用用户输入的值 open System let rec fact x = if x < 1 then 1 else x * fact (x - 1) let input = Console.ReadLine() Console.WriteLine(fact input) 开放系
open System
let rec fact x =
if x < 1 then 1
else x * fact (x - 1)
let input = Console.ReadLine()
Console.WriteLine(fact input)
开放系统
让我们记录事实x=
如果x<1,则为1
else x*事实(x-1)
让输入=Console.ReadLine()
Console.WriteLine(事实输入)
它经常给我一个错误,说“这个表达式应该有类型“int”,但这里有类型“string”。如果有人对如何使其正常工作有任何想法(或者至少可以告诉我如何将用户输入的值转换为INT,那将不胜感激
谢谢您的帮助。F#不会自动转换,因此您需要解析字符串:
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))
开放系统
让我们记录事实x=
如果x<1,则为1
else x*事实(x-1)
让输入=Console.ReadLine()
Console.WriteLine(事实(Int32.Parse输入))
理论上,您需要将其转换回字符串以打印它,但这是有效的,因为Console.WriteLine有一个重载,它接受一个整数并进行转换。因为:
somevalue |> int
及
在无效输入上引发异常防止应用程序在运行时崩溃不是更好吗
因为我找不到任何返回int option
的函数,所以我编写了一个:
let asInt32 numberString =
let (success,num) =
System.Int32.TryParse(numberString)
if success then
Some num
else
None
asInt32 "22"
(按照古斯塔沃的建议使用特里帕尔斯)我的建议是尝试使用F#函数,除非没有等效的F#函数
open System
let rec fact x =
if x < 1 then 1
else x * fact (x - 1)
let input = Console.ReadLine()
Console.WriteLine(fact input)
第二,F#中的类型转换函数有系统。(type)。(Try)Parse
。Try
“这里是可选的,type
是任何数字类型,如int8
,…,int64
,float32
和float.(最后一个是64位)
所以int“123”=System.Int32.Parse(“123”)
是真的。这两个函数是等价的。这也适用于浮点数
第三,如果可以,尝试使用尾部递归:
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))
我不知道在F#中是否有与ReadLine等价的东西。我找不到
尝试坚持F#风格,不要在C#和F#之间跳来跳去的原因是,其他读者和你自己可能会感到困惑,因为这可能会降低代码的可读性。这不会在运行时爆炸吗?以及
somevalue |>int
。这会违反F#编译安全,告诉你编译i时的危险n不要让你的应用程序在运行时崩溃。@HMR当然它会在运行时崩溃,我不建议在生产中使用此代码,也不建议提供最佳实践方面的建议,只是回答这个问题。对于生产代码,更好的方法是使用tryParse
函数,但它需要了解如何处理它,并且这似乎是一个新手问题。这不是什么大问题。但是如果你写F代码,请使用printf formatstring>arg list<或printfn formatstring>arg list<这是控制台的eqauvalent.WriteLine(formatstring,arg list)。至于将字符串解析为int(size)和float(size),就我所能看到的系统而言,类型caster有。(type).Parse嵌入其中。因此Int32.Pars(“123”)=int“123”和float32.Parse(“123.45”)=float32“123.45”您声明“Try”是可选的
。但是,这不一定是真的。例如,int“abc”
使程序崩溃,而Int32.TryParse(“abc”)
将更优雅地失败。
fact 4 = 24