【发布时间】:2019-02-20 20:57:26
【问题描述】:
这是F#中函数的简单组合
let composedFunction = System.Text.Encoding.UTF8.GetBytes >> Array.length
"test" |> composedFunction
类型推断正确定义了组合函数string -> int 的类型。但是编译器无法选择System.Text.Encoding.UTF8.GetBytes 方法的正确重载:
错误 FS0041:方法“GetBytes”的唯一重载不能 根据此程序点之前的类型信息确定。一种 可能需要类型注释。候选人:
System.Text.Encoding.GetBytes(chars: char []) : byte [],
System.Text.Encoding.GetBytes(s: string) : byte []Blockquote
有没有办法compose纠正接受字符串参数的System.Text.Encoding.UTF8.GetBytes的重载?
当然,我可以做以下
// declare function which calls correct overload and then use it for compostion
let getBytes (s: string) = System.Text.Encoding.UTF8.GetBytes s
let composedFunction = getBytes >> Array.length
// start composition with ugly lambda
let composedFunction =
(fun (s: string) -> s) >> System.Text.Encoding.UTF8.GetBytes >> Array.length
但我想知道是否有任何方法无需额外的函数声明来使编译器根据推断的string -> int类型的组合函数来选择正确的重载?
【问题讨论】:
-
您是否尝试在函数上指定类型,例如
let composedFunction : string -> _ = ...?
标签: f#