作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码段说明了我遇到的错误。即使两个匹配分支都返回相同的东西;我得到错误,“这个表达式应该有单位类型,但这里有类型'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/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!