Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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# - Fatal编程技术网

如何执行此F#函数

如何执行此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

我试图以多种方式执行以下函数,但总是出错。 那么如何执行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 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