F#函数式编程:为何出现类型不匹配错误?
F#类型不匹配错误解决方法
作为F#新手,我难以理解为何会出现以下错误。以下是我的代码:
open System open System.Globalization let toUpperCase (input: string) = input.ToUpper() let uCaseAll (input: string) = input.Split() |> Array.map toUpperCase |> String.concat " " [<EntryPoint>] let main argv = let text = "You’re in the right place. Tell us what titles or genres you’ve enjoyed in the past, and we’ll give you surprisingly insightful recommendations." printfn "Result: %s" uCaseAll text
收到的错误信息为:
Type mismatch. Expecting a 'string -> 'a -> int' but given a 'string -> unit' The type ''a -> int' does not match the type 'unit' This expression was expected to have type 'string' but here has type 'string -> string'
我感到困惑,因为我的函数明确定义为接收string并返回string,但编译器却认为我在处理int和uint类型。请问我哪里出错了?
错误根源在main函数里的printfn调用语句。你当前的写法printfn "Result: %s" uCaseAll text中,F#会将uCaseAll识别为printfn的第二个参数,但格式字符串%s要求传入的是字符串值,而uCaseAll是一个string -> string类型的函数,并非字符串,这就触发了类型不匹配。
修正方法很简单,给uCaseAll text加上括号,明确表示先调用函数得到结果,再传给printfn:
printfn "Result: %s" (uCaseAll text)
补充说明:F#里函数调用默认用空格分隔,但当你需要把函数调用的结果作为参数传给另一个函数时,必须用括号包裹函数调用表达式,否则编译器会把函数本身当作参数传递,而非函数执行后的返回值。
内容的提问来源于stack exchange,提问作者Cade Bryant
相关产品推荐
相关产品推荐

