微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

f# – 如何从多步骤管道功能的每个步骤中获得中间结果?

我有一个代码如下:

this.GetItemTypeIdsAsListForOneItemTypeIdTreeUpIncludeItemType itemType.AutoincrementedId
|> Array.map (fun i -> i.AutoincrementedId)
|> Array.map (BusinessLogic.EntityTypes.getFullSetofEntityTypeFieldValuesForItemTypeAid item.Autoincrementedid)
|> Array.fold Array.append [||]
|> Array.map (fun fv -> { fv with ReferenceAutoId = aid } )
|> Array.toSeq
|> Seq.distinctBy (fun fv -> fv.Fieldname)
|> Seq.toArray

有时这样的代码得到了我需要解释的不寻常的结果.通常代码中没有错误.数据中存在错误.我需要解释为什么这个数据支持不正确.最好的方法是什么?

我只想看一下这个表达式每一步的列表.

就像是:

func data
|> func2 && Console.WriteLine
|> func3 && Console.WriteLine
....

获取输入,将其拆分为两个.将其中一个输出传递给下一个函数,然后将第二个输出传递给控制台.

解决方法

对于快速而肮脏的解决方案,您始终可以添加如下函数

// ('a -> unit) -> 'a -> 'a
let tee f x = f x; x

例如,如果您有这样的组合:

[1..10]
|> List.map string
|> String.concat "|"

你可以插入三通以达到副作用:

[1..10]
|> List.map string
|> tee (printfn "%A")
|> String.concat "|"

这不是功能性的,但如果您只需要查看一些中间值,则可以在紧要关头使用;例如用于故障排除

否则,对于“适当的”功能解决方案,也许应用State monad可能是合适的.这将使您能够在执行计算时携带状态.例如,州可以包含沿途收集的自定义消息……

如果您只是想在发现问题时立即“退出”,那么Either monad就是合适的选择.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐