Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何在F中的函数中使用用户输入的值#_F#_User Input_Factorial - Fatal编程技术网

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) 开放系

因此,我试图在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)
开放系统
让我们记录事实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