作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了一个简单的函数,它包装了签名 'a -> 'b -> 'c option
的常见 F# 函数更多“符合 C#”的功能为:'a -> b -> byref<'c> -> bool
.但不知何故,当我尝试将这样的方法包装在一个类中时,我得到了错误 FS0001 并且我找不到错误。
下面的代码
open System
open System.Runtime.InteropServices
// Given a function, f: 'a -> 'b -> 'c option returns
// A new function g: 'a -> 'b -> byref<'c> -> bool
let wrapOptionF f a b (g:byref<'c>) =
match f a b with
| Some v ->
do g <- v
true
| None ->
false
let tryDivide (a:int) (b:int) =
match Math.DivRem(a,b) with
| v, 0 -> Some v
| _ -> None
type TryDivideWrapper() =
static member TryDivide(a, b, [<Out>]cRef:byref<int>) : bool =
let f = wrapOptionF tryDivide a b
f cRef
f cRef
.
最佳答案
This post包含更深入的解释,但简而言之,您可以将最终类型定义替换为以下内容:
type TryDivideWrapper() =
static member TryDivide(a, b, [<Out>]cRef:byref<int>) : bool =
wrapOptionF tryDivide a b &cRef
wrapOptionF
需要
byref
范围。但是,
byref<int>
不是真正的类型
int
或
int ref
- 这只是向编译器指示您的参数应通过引用传递(如 C# 中的
out
)。然而,一旦进入你的函数,你所拥有的是一个普通的
int
。 .
cRef
具有类型
byRef<int>
.但是,如果将另一个变量绑定(bind)到
cRef
, 你会看到你得到的类型是一个普通的
int
.您可以将此行放入
TryDivide
然后将鼠标悬停在
a
看见了:
let a = cRef
&
运算符告诉编译器您正在传递
cRef
进入
f
通过引用 - 这正是
f
需求 - 使类型系统满意。我已经使用 C# 项目对此进行了测试,并且
TryDivideWrapper.TryDivide(a, b, out c)
按预期工作。添加@MarkSeemann 的
tryDivide
你应该很高兴。
关于f# - 错误 FS0001,此函数应具有类型 byref<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35528682/
我是一名优秀的程序员,十分优秀!