我有一个复制自的验证模块面向铁路的编程 http://fsharpforfunandprofit.com/posts/recipe-part2/在我的应用程序中执行错误处理:
type ErrorMessage = ErrorMessage of string
type ValidationResult<'T> =
| Success of 'T
| Error of ErrorMessage
module ValidationResult =
let doubleMap successHandler errorHandler = function
| Success x -> successHandler x
| Error e -> errorHandler e
let bind f = function
| Success x -> f x
| Error e -> Error e
let (>=>) f g = f >> bind g
我使用以下测试函数测试 Kleisli 组合:
let validation1 (list: int list) =
if List.length list = 6
then Success list
else Error <| ErrorMessage "Length error"
let validation2 list =
if List.forall (fun x -> x > 6) list
then Success list
else Error <| ErrorMessage "All elements must be larger than 6"
let combined = validation1 >=> validation2
//^^^^^^^^^^^^ compile error
据我了解,validation1
and validation2
应该组成,因为两者都是类型int list -> ValidationResult<int list>
。但是我遇到了编译错误
需要一个支持运算符 '>=>' 的类型,但给定一个函数
类型。您可能缺少函数的参数。
我该如何解决这个问题?
看来你只是忘记了open ValidationResult
,因此您的组合运算符不在范围内。
对于普通函数,F# 会抱怨该符号未定义。但运营商却是另一回事。
可以通过两种方式定义运算符:作为独立函数(函数式方式)或作为传递给运算符的类型之一的静态成员(.NET 方式)。在前一种情况下,函数需要在作用域内可见,但在后一种情况下则不然:只要您设法使用定义为静态成员的运算符来获取对象,就不需要它的类型可见。
这就是为什么 F# 说它“需要一个支持运算符的类型”而不是“函数未定义”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)