gpt4 book ai didi

f# - Kleisli 组合的编译错误

转载 作者:行者123 更新时间:2023-12-01 06:37:47 26 4
gpt4 key购买 nike

我有一个从 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

据我了解,validation1validation2应该组成,因为两者都是 int list -> ValidationResult<int list> 类型.但是我遇到了编译错误

Expecting a type supporting the operator '>=>' but given a function type. You may be missing an argument to a function.

我该如何解决这个问题?

最佳答案

看来您只是忘记了打开 ValidationResult,所以您的组合运算符不在范围内。

对于普通函数,F# 会提示符号未定义。但运营商是另一回事。

运算符可以通过两种方式定义:作为独立函数(函数式方式)或作为传递给运算符的一种类型的静态成员(.NET 方式)。在前一种情况下,该函数需要在范围内可见,但在后一种情况下则不需要:只要您设法获得一个带有定义为静态成员的运算符的对象,您就不需要它的类型可见。

这就是为什么 F# 说它“需要一个类型支持运算符”而不是“函数未定义”。

关于f# - Kleisli 组合的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com