什么原因导致REPL打印函数签名而不是函数结果?
我试图执行以下行:
let email = Email "abc.com";;
email |> sendMessage |> ignore;;
Run Code Online (Sandbox Code Playgroud)
代码如下
type PhoneNumber =
{ CountryCode:int
Number:string }
type ContactMethod =
| Email of string
| PhoneNumber of PhoneNumber
let sendMessage contact = function
| Email _ -> printf "Sending message via email"
| PhoneNumber phone -> printf "Sending message via phone"
// c. Create two values, one for the email address case and
// one for the phone number case, and pass them to sendMessage.
let email = Email "abc.com";;
email |> sendMessage |> ignore;;
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
type PhoneNumber =
{CountryCode: int;
Number: string;}
type ContactMethod =
| Email of string
| PhoneNumber of PhoneNumber
val sendMessage : contact:'a -> _arg1:ContactMethod -> unit
val email : ContactMethod = Email "abc.com"
>
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)
我期待这样的事情:
"通过电子邮件发送消息"
您的sendMessage函数有两个参数:一个名为contactunrestricted type 'a,一个是匿名(_arg1在签名中)ContactMethod.
当你提供email给sendMessage你一个功能,需要一个ContactMethod并返回unit.然后你ignore这个功能.
删除contact参数(更惯用):
let sendMessage = function
| Email _ -> printf "Sending message via email"
| PhoneNumber phone -> printf "Sending message via phone"
Run Code Online (Sandbox Code Playgroud)
或匹配(可能更容易理解):
let sendMessage contact =
match contact with
| Email _ -> printf "Sending message via email"
| PhoneNumber phone -> printf "Sending message via phone"
Run Code Online (Sandbox Code Playgroud)
现在,sendMessage是类型ContactMethod -> unit,你不再需要ignore了.