【发布时间】:2016-03-06 03:28:45
【问题描述】:
我有一个从Railway oriented programming 复制的验证模块,它在我的应用程序中执行错误处理:
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 和 validation2 应该组成,因为两者都是 int list -> ValidationResult<int list> 类型。但是我得到了一个编译错误
期望一个支持运算符'>=>'的类型,但给定了一个函数 类型。您可能缺少函数的参数。
我该如何解决这个问题?
【问题讨论】:
-
你忘记
open ValidationResult了吗? -
@FyodorSoikin,我犯了一个多么愚蠢的错误……没想到事情这么简单。如果您将评论作为答案,我将很乐意接受。谢谢
标签: f#