【发布时间】:2017-03-26 01:20:00
【问题描述】:
我正在尝试用 F# 构建一个计算器。因此,我从用户那里获取有关要执行的操作的输入。对于输入 6,它应该显示用于科学操作的菜单,但是,它说表达式应该具有 unit 类型但具有 float 类型。而且在 scienceFun() 函数中,对于最后一行,它说,“表达式应该有浮点数,但这里有单位”。我不确定这意味着什么。被困在这几个小时了。任何帮助,将不胜感激。谢谢!。 ** 或粗线表示发生错误的位置。
open System
let mutable ok = true
while ok do
Console.WriteLine("Choose a operation:\n1.Addition\n2.Substraction\n3.Multiplication\n4.Division\n5.Modulo\n6.Scientific")
let input= Console.ReadLine()
let add() =
Console.WriteLine("Ok, how many numbers?")
let mutable count = int32(Console.ReadLine())
let numberArray = Array.create count 0.0
for i in 0 .. numberArray.Length - 1 do
let no = float(Console.ReadLine())
Array.set numberArray i no
Array.sum numberArray
let expo() =
Console.WriteLine("Enter the base")
let getBase = Console.ReadLine()
Console.WriteLine("Enter the exponent")
let getExponent = Console.ReadLine()
float(getBase) ** float(getExponent)
let sqRoot() =
Console.WriteLine("Enter a number")
let no = float(Console.ReadLine())
Math.Sqrt no
let rec fact (n:float) =
if n < 1.0 then 1.0
else n * fact (n - 1.0)
let factorial() =
Console.WriteLine("Enter a number")
let no = float(Console.ReadLine())
fact(no)
let Trigsin() =
Console.WriteLine("Enter an angle")
let angle = float(Console.ReadLine())
Math.Sin angle
let Trigcos() =
Console.WriteLine("Enter an angle")
let angle = float(Console.ReadLine())
Math.Cos angle
let Trigtan() =
Console.WriteLine("Enter an angle")
let angle = float(Console.ReadLine())
Math.Tan angle
let logicalAnd() =
Console.WriteLine("Enter first number")
let first = int32(Console.ReadLine())
Console.WriteLine("Enter second number")
let second = int32(Console.ReadLine())
float(first &&& second)
let logicalOr() =
Console.WriteLine("Enter first number")
let first = int(Console.ReadLine())
Console.WriteLine("Enter second number")
let second = int(Console.ReadLine())
float(first ||| second)
let logicalNot()=
Console.WriteLine("Enter a number")
let first = int32(Console.ReadLine())
float(~~~first)
let sub x y = x - y
let mul x y = x * y
let div x y = x / y
let MOD x y = x % y
let scientificFun() =
printfn("1.Exponential\n2.Square Root\n3.Factorial\n4.sin()\n5.cos()\n6.tan()\n7.AND\n8.OR\n9.NOT")
let scientificInput = Console.ReadLine()
match scientificInput with
|"1" -> expo()
|"2" -> sqRoot()
|"3" -> factorial()
|"4" -> Trigsin()
|"5" -> Trigcos()
|"6" -> Trigtan()
|"7" -> logicalAnd()
|"8" -> logicalOr()
|"9" -> logicalNot()
| _ -> **printfn("Choose between 1 - 9")**
match input with
| "1" -> printfn("The Result is: %f") (add())
//| "2" -> printfn("The Result is: %f") (sub A B)
//| "3" -> printfn("The Result is: %f") (mul A B)
///| "4" -> printfn("The Result is: %f") (div A B)
//| "5" -> printfn("The Result is: %f") (MOD A B)
| "6" -> **scientificFun()**
| _-> printfn("Choose between 1 and 6")
Console.WriteLine("Would you like to use the calculator again? y/n")
let ans = Console.ReadLine()
if ans = "n" then
ok <- false
else Console.Clear()
【问题讨论】:
-
模式匹配的所有返回值必须是同一类型。匹配
scientificInput的所有函数都返回float,但printfn除外,它返回unit。 -
谢谢@Funk..你能给我一个想法,我怎样才能做到这一点。?。按6后,我想显示科学菜单
-
有几种方法。您可以在匹配之前检查
int是否在正确的范围内,因此在模式匹配中将不再需要printfn。您还可以使用optiontype“捕获”恶意输入。所有好的输入都会导致Some('float'),而错误的输入会导致None。
标签: f# functional-programming f#-interactive f#-3.0