如何执行此F#函数
我试图以多种方式执行以下函数,但总是出错。 那么如何执行constructQuery:如何执行此F#函数,f#,F#,我试图以多种方式执行以下函数,但总是出错。 那么如何执行constructQuery: type PersonName = | FirstOnly of string | LastOnly of string | FirstLast of string * string let constructQuery personName = match personName with | FirstOnly(firstName) -> printf "May I call yo
type PersonName =
| FirstOnly of string
| LastOnly of string
| FirstLast of string * string
let constructQuery personName =
match personName with
| FirstOnly(firstName) -> printf "May I call you %s?" firstName
| LastOnly(lastName) -> printf "Are you Mr. or Ms. %s?" lastName
| FirstLast(firstName, lastName) -> printf "Are you %s %s?" firstName lastName
-编辑-
我尝试过这样调用函数:
constructQuery "himekami"
constructQuery ("himekami" : PersonName.FirstOnly)
constructQuery PersonName.FirstOnly("himekami")
constructQuery firstOnly
constructQuery lastOnly
constructQuery firstLast
constructQuery LastOnly "Hengs" = (constructQuery LastOnly) "Hengs" // error: compiler complains about mismatched types
let constructQuery : PersonName -> string =
function
| FirstOnly(firstName) -> sprintf "May I call you %s?" firstName
| LastOnly(lastName) -> sprintf "Are you Mr. or Ms. %s?" lastName
| FirstLast(firstName, lastName) -> sprintf "Are you %s %s?" firstName lastName
FirstOnly "Tom"
|> constructQuery
|> Console.WriteLine
产生的错误是这样的:
Analyzer.fs(12,17): error FS0001: This expression was expected to have type
PersonName
但这里有一种类型
串
这是因为我不太了解F#中“type”的工作方式。我想问题是如何构造
PersonName
对象(因为这些是函数的输入)
这很简单-只需使用一个构造函数FirstOnly
,LastOnly
或FirstLast
:
let firstOnly = FirstOnly "Tom"
let lastOnly = LastOnly "Hengs"
let firstLast = FirstLast ("Tom", "Hengs")
您可以这样使用它们:
constructQuery "himekami"
constructQuery ("himekami" : PersonName.FirstOnly)
constructQuery PersonName.FirstOnly("himekami")
constructQuery firstOnly
constructQuery lastOnly
constructQuery firstLast
constructQuery LastOnly "Hengs" = (constructQuery LastOnly) "Hengs" // error: compiler complains about mismatched types
let constructQuery : PersonName -> string =
function
| FirstOnly(firstName) -> sprintf "May I call you %s?" firstName
| LastOnly(lastName) -> sprintf "Are you Mr. or Ms. %s?" lastName
| FirstLast(firstName, lastName) -> sprintf "Are you %s %s?" firstName lastName
FirstOnly "Tom"
|> constructQuery
|> Console.WriteLine
出身背景
您可以看到,PersonName
是一个代数数据类型,它有3个构造函数,constructQuery
匹配它们的唯一参数。在VisualStudio(或MonoDevelop)中,您应该能够获得包含每个部分的类型的工具提示—您应该一直这样做,因为类型是理解的重要部分
调用此函数的其他方法
您可以使用管道操作符|>
,一次完成此操作:
FirstOnly "Tom"
|> constructQuery
当然,您也可以在不使用此运算符的情况下使用它:
constructQuery (LastOnly "Hengs")
但是这里您需要参数,因为如果没有它们,您将把函数LastOnly
(是的,这是一个函数字符串->人名
)插入函数constructQuery
,然后像这样应用字符串:
constructQuery "himekami"
constructQuery ("himekami" : PersonName.FirstOnly)
constructQuery PersonName.FirstOnly("himekami")
constructQuery firstOnly
constructQuery lastOnly
constructQuery firstLast
constructQuery LastOnly "Hengs" = (constructQuery LastOnly) "Hengs" // error: compiler complains about mismatched types
let constructQuery : PersonName -> string =
function
| FirstOnly(firstName) -> sprintf "May I call you %s?" firstName
| LastOnly(lastName) -> sprintf "Are you Mr. or Ms. %s?" lastName
| FirstLast(firstName, lastName) -> sprintf "Are you %s %s?" firstName lastName
FirstOnly "Tom"
|> constructQuery
|> Console.WriteLine
因为LastOnly
实际上是一个函数(遗憾的是,C#构造函数不是这样的),所以你也可以做一些很酷的事情,比如:
// Pipes all the way
"Hengs" |> LastOnly |> constructQuery
// this is another function String -> PersonName
let constructFromLastOnly = LastOnly >> constructQuery
// you can call it like this
constructFromLastOnly "Hengs"
// etc. ... imagine
另一种选择是使用反向管道
请编辑问题,解释您尝试了哪些方法以及出现了哪些错误。这很好。感觉像是个人辅导。非常感谢。np-有心情;)-问问吧——我们需要更多的F#er:D