gpt4 book ai didi

f# - if-then 语句的功能替代是什么?

转载 作者:行者123 更新时间:2023-12-03 06:36:26 24 4
gpt4 key购买 nike

我一直在学习 F# 和函数式编程,并尝试以函数式方式做事。然而,当涉及到重写一些我已经用 C# 编写的代码时,我陷入了简单的 if-then 语句(只做某事,不返回值的语句)。我知道您可以在 F# 中完成此任务:

if expr then do ()

但是,我认为这是一种必要的编码方法?也许我对函数式编程了解得还不够,但它对我来说似乎并不实用。我认为函数式方法是组合函数和表达式,而不是简单地一个接一个地执行语句,这似乎是 if-then 所鼓励的。

那么,我是否遗漏了一些东西,并且 if-then 在函数世界中完全没问题?如果不是,这样的语句的功能等价物是什么?我怎样才能采用 if-then 并使其发挥作用?

编辑:我可能问了错误的问题(抱歉,对于函数式编程来说还相当陌生):让我们举一个现实世界的例子,这让我什至问了这个:

if not <| System.String.IsNullOrWhiteSpace(data) then do
let byteData = System.Text.Encoding.Unicode.GetBytes(data)
req.ContentLength <- int64 byteData.Length
let postStream : System.IO.Stream = req.GetRequestStream()
postStream.Write(byteData, 0, byteData.Length)
postStream.Flush()
postStream.Dispose()

if-then 的主体不返回任何内容,但我不知道如何使其更实用(如果可能的话)。我不知道最小化命令式代码的正确技术。鉴于 F# 的性质,直接传输我的 C# 相当容易,但我在使其发挥作用时遇到了困难。每次我在 C# 中遇到这样的 if 语句,并尝试将其传输到 F# 时,我都会感到沮丧,因为我无法想出一种方法来使代码更具功能性。

最佳答案

到目前为止还没有提到的一个重要点是 if .. then .. else 之间的区别和if .. then没有 else分支。

If在函数式语言中

if的功能解释是它是一个计算结果为某个值的表达式。评估 if c then e1 else e2 的值您评估条件c然后评估 e1e2 ,取决于条件。这将为您提供 if .. then .. else 的结果.

如果您只有 if c then e ,那么你不知道评估的结果应该是什么,如果 cfalse ,因为没有else分支!以下内容显然没有意义:

let num = if input > 0 then 10

在 F# 中,具有副作用的表达式如 printf "hi"返回 unit 类型的特殊值。该类型只有一个值(写为 () ),因此您可以写 if它仅在单一情况下产生效果:

let u = if input > 0 then printf "hi" else ()

其计算结果始终为 unit ,但是在 true分支,它也执行副作用。在 false分支,它只返回 unit值(value)。在 F# 中,您不必编写 else ()用手一点点,但从概念上讲,它仍然存在。你可以写:

let u = if input > 0 then printfn "hi"

关于您的附加示例

代码对我来说看起来非常好。当您必须处理命令式 API(如许多 .NET 库)时,最好的选择是使用命令式功能,如 ifunit -返回分支。

您可以使用各种调整,例如使用 option<string> 表示您的数据(而不只是 stringnull 或空字符串)。这样,您可以使用 None表示缺失的数据,其他任何内容都是有效的输入。然后您可以使用一些高阶函数来处理选项,例如 Option.iter ,如果有值则调用给定函数:

maybeData |> Option.iter (fun data ->
let byteData = System.Text.Encoding.Unicode.GetBytes(data)
req.ContentLength <- int64 byteData.Length
use postStream = req.GetRequestStream()
postStream.Write(byteData, 0, byteData.Length) )

这并不是真正不那么命令式,而是更具声明性,因为您不必编写 if你自己。顺便说一句:我还建议使用 use如果你想 Dispose自动对象。

关于f# - if-then 语句的功能替代是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298419/

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