gpt4 book ai didi

f# - 令人困惑的 F# 编译器消息

转载 作者:行者123 更新时间:2023-12-01 07:44:41 25 4
gpt4 key购买 nike

以下代码段说明了我遇到的错误。即使两个匹配分支都返回相同的东西;我得到错误,“这个表达式应该有单位类型,但这里有类型'a ->单位”我不知道编译器在这里想要什么......

open System.IO 

let FileContent contents =
match contents with
| "" -> None
| c -> Some(c)

let WriteSomething (contents:string) =
let writer = new StreamWriter("")
writer.Write( contents ) |> ignore

let DoStuffWithFileContents =
let reader = new StreamReader( "" )
let stuff = reader.ReadToEnd()
match stuff |> FileContent with
| Some(c) -> WriteSomething c
|> ignore
| None -> ignore // <- error on "ignore"

最佳答案

ignore运算符实际上是一个接受单个输入并返回 unit type 的函数。 (F# 相当于 void)。因此,当您有 ->ignore 时,您将返回 ignore 函数。

改为使用()来表示unit类型的值:

  | Some(c) -> WriteSomething c  
|> ignore
| None -> ()

但实际上,自从 StreamWriter.Write返回 void,所有这些 ignore 都是不必要的。你可以很容易地写成这样:

let WriteSomething (contents:string) =  
let writer = new StreamWriter("")
writer.Write(contents)

let DoStuffWithFileContents =
let reader = new StreamReader("")
let stuff = reader.ReadToEnd()
match stuff |> FileContent with
| Some(c) -> WriteSomething c
| None -> ()

或者更好,使用 Option.iter :

let WriteSomething (contents:string) =  
let writer = new StreamWriter("")
writer.Write(contents)

let DoStuffWithFileContents =
let reader = new StreamReader("")
let stuff = reader.ReadToEnd()
stuff |> FileContent |> Option.iter(WriteSomething)

关于f# - 令人困惑的 F# 编译器消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27609657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com