为什么此 F# 函数需要括号?

2023-11-27

为什么需要括号read_rest_of_csv below?

    let read_rest_of_csv() =
        csv_data.Add(csv_fileH.ReadFields()) |> ignore
        not csv_fileH.EndOfData

    while read_rest_of_csv() do ignore None

如果没有括号,循环将不会终止。

open System
open System.Threading
open System.Collections.Generic
open System.Linq
open System.Text
open System.Threading.Tasks
open System.IO
open Microsoft.VisualBasic.FileIO

[<EntryPoint>]
let main argv =
    let csv_fileH = new TextFieldParser("test1.csv")
    csv_fileH.TextFieldType = FieldType.Delimited |> ignore
    let x = csv_fileH.SetDelimiters(",")
    let csv_data = new List<string[]>()

    let eod = csv_fileH.EndOfData
    if not eod then
        let column_headings = csv_fileH.ReadFields()
        csv_data.Add(column_headings) |> ignore

        let read_rest_of_csv =
            csv_data.Add(csv_fileH.ReadFields()) |> ignore
            not csv_fileH.EndOfData

        while read_rest_of_csv do ignore None

    0 

很抱歉我不记得在哪里看到过这个。我认为是在SO中。这是一个很好的例子。

难道在没有括号的情况下我正在处理某种函数对象吗?

我确实不仅有 C、C++ 和 C# 背景,而且还有中级 Clojure 背景。对于我使用 F# 语法的情况,更详细地阅读我的 Haskell 手册可能会有所帮助,因为语法看起来很相似。


来自 C 系列语言(C#、Java、C、C++、JavaScript)的人们似乎在理解 F# 中括号的使用时遇到问题。我当然有,而且我花了几年时间才了解事情是如何运作的。

简而言之,F# 中最基本的构建块是value。值可以是let-bound:

let foo = bar

这意味着foo是一个值,恰好等于bar.

函数也是值:

// 'a -> 'a * 'a
let f = fun x -> x, x

Here, f是一个带有一些值的函数(x) 并返回一个元组x作为第一个和第二个元素。

写起来有点麻烦,所以有一个简写:

// 'a -> 'a * 'a
let f x = x, x

请注意,这些表达式中没有括号。

有时您需要调整运算符的优先级。就像数学一样,1 + 2 * 3(这相当于1 + (2 * 3)) 不等于(1 + 2) * 3。在 F# 中,您还可以使用括号来覆盖优先级。因此

// 'a -> string * 'a
let f x = someOtherFunction x, x

不等于

// x:'a -> string
let f x = someOtherFunction (x, x)

(在这种情况下,someOtherFunction是一个返回 a 的函数string.)

请注意,括号并不表示函数调用;而是表示函数调用。它们只是为了控制评估顺序。

有时,您想要定义一个不接受任何输入的函数。但是,您不能这样定义它:

let f = whatever

因为这将使它成为value那就是立即let-势必whatever。相反,您可以让函数采用内置类型的值unit。该类型只有一个值,写为():

let f () = whatever

这意味着f是一个函数模式匹配它的输入与唯一已知的值unit.

每当你调用f with (), 表达方式whatever被评估并返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么此 F# 函数需要括号? 的相关文章

  • 在自己的定义中使用变量?

    无限流 val ones Stream Int Stream cons 1 ones 一个值怎么可能在它自己的声明中使用呢 看起来这应该会产生编译器错误 但它确实有效 它并不总是递归定义 这实际上有效并产生 1 val a Int a 1
  • 如何解决“程序主模块为空:运行时不会发生任何事情”

    我在 F 解决方案中有两个项目 1 主要项目有 EntryPoint http msdn microsoft com en us library dd402151 aspx并设置为启动项目 2 support 第二个项目 拥有一组支持模块
  • 如何在 FsCheck 中注册任意实例并让 xUnit 使用它?

    我有一个类型Average有一个字段count这是积极的int64 and a double字段称为sum 我做了一个任意的生成有效实例的操作 let AverageGen Gen map2 fun s c gt Average float
  • 如何使用 swift flatMap 从数组中过滤掉选项

    我对 flatMap 有点困惑 添加到 Swift 1 2 假设我有一些可选类型的数组 例如 let possibles Int nil 1 2 3 nil nil 4 5 在 Swift 1 1 中 我会做一个过滤器 然后是一个像这样的地
  • “foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是什么意思?

    我遇到了以下代码片段 函数定义 choose x xs choosep x xs where choosep x x choosep x x choosep x xs choosep x xs in 柯里编程语言 http en wikip
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • F# 获取随机数列表

    我正在尝试用随机数填充列表 但很难获得随机数部分 我现在打印出一个随机数 10 次 我想要的是打印出 10 个不同的随机数 let a new System Random Next 1 1000 let listOfSquares for
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 将属性应用于返回值 - 在 F# 中

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca

随机推荐

  • 使用 MongoTemplate 进行 Spring Boot

    我是 Spring Boot 和 MongoDb 的新手 尝试使用 Mongo 存储库和 Spring Boot 的一些示例 但在浏览了一些文档后发现 Mongo Template 将是一个更好的选择 无法使用 Mongo 模板示例获取正确
  • WF4 RC - 使用 ActivityXamlServices 从松散 Xaml 加载 WF 服务时无法创建未知类型

    我正在尝试动态托管 WF4 RC 服务 我有一个包含两个项目的测试解决方案 第一个是声明性工作流服务库 其中包含一个根 Flowchart 活动和一个简单的自定义代码活动 工作流服务库不依赖于任何其他自定义程序集或引用 第二个是我的主机应用
  • 访问基本过滤器 Play Framework 2 中的请求正文

    我是斯卡拉新手 正如play框架官方文档中提到的https www playframework com documentation 2 3 x ScalaHttpFilters Play 提供了一个名为 EssentialFilter 的较
  • 构造函数可以是异步的吗?

    我有一个项目 我试图在构造函数中填充一些数据 public class ViewModel public ObservableCollection
  • 如何处理 Java/Android 中的慢速网络连接

    我有一个应用程序需要多次调用 MySQL 数据库 它在一个AsyncTask 下面是一个可能看起来像的示例 我的主要问题是这样的 有时 主机 Godaddy 呃 决定停止连接 而我的progressDialog加载 加载 加载更多 直到强行
  • 如何在android中使用SearchView小部件时突出显示过滤后的文本

    我已经实施了SearchView我的应用程序中的小部件 它工作正常 现在我需要做的是 每当我在我的SearchView Bar 过滤结果应突出显示搜索的单词 喜欢 我正在用这个搜索视图小部件为 Override public void on
  • Twitter:在 C# 中验证用户名和密码

    赏金问题 我正在使用 c 3 5 窗口窗体应用程序 我正在使用已接受的答案中提到的代码 我收到以下错误 远程服务器返回错误 401 未经授权 验证用户名和密码的示例代码将非常感激 赏金问题结束 我有一个具有以下用例的应用程序 当用户第一次开
  • 打算在Android上启动时钟应用程序

    我制作的时钟小部件遇到问题 我希望用户触摸时钟并启动手机上的时钟应用程序 这是代码 this worked on my nexus 2 1 if VERSION SDK equals 7 RemoteViews views new Remo
  • QML 条件绑定未按预期工作

    如果我有一个简单的Binding形式的对象 Rectangle height 400 width 500 property var someObj null Binding on color when someObj value someO
  • TypeError:只能将 str (不是“NoneType”)连接到 str

    尝试在 Python 3 7 中构建一个大写到小写的字符串转换器 这是我的代码 def convertChar char if char gt A and char lt Z return chr ord char 32 def toLow
  • 如果刷新 AJAX 请求的内容 (ob_flush),内容会被加载吗?

    我的意思是 让我们发出一个 AJAX 请求并将结果插入到 div result 中 在后端脚本使用ob flush 发送标头 但在请求终止之前不终止请求 使用exit or ob flush end 仅当请求终止时 内容才会加载到 resu
  • Unity中序列化和反序列化Json和Json数组

    我有一个从 PHP 文件发送到 unity 的项目列表WWW The WWW text好像 playerId 1 playerLoc Powai playerId 2 playerLoc Andheri playerId 3 playerL
  • 根据 的状态设置

    仅使用 CSS 是否可以根据输入的状态来设置 HTML 标签的样式 就我而言 我想要设计一个
  • 按第二项(整数值)对元组列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个元组列表 看起来像这样 abc 121 abc 231 abc 148 abc 221 我想按元组内的整数值升序排列此列表 是否可以 尝试使用key的关键字参数sorted 默认按升序排序 sorted
  • 球拍博士中的 mcons

    我在读取球拍博士的输出时遇到问题 默认情况下 它使用 mcons 显示列表 例如 sicp 练习 2 32 生成 gt subsets list 1 2 3 mcons mcons mcons mcons 3 mcons mcons 2 m
  • 通过 Xpath 查找包含文本的元素

    如果我搜索单个字符串 这效果很好 var element Driver FindElement By XPath a contains text About us 但我可以有一个or语句如下面的示例所示 var element Driver
  • 一个视图控制器中的两个 TableView [重复]

    这个问题在这里已经有答案了 我有一个按钮和两个按钮tableViewControllers在一个视图控制器中 因此 如果我按下该按钮 第一个表视图控制器将出现 并且它将按行显示一些数据 如果我选择第一个表视图控制器中的任何行 第二个表视图控
  • 使用 Yii 重定向访问规则

    我正在做一个需要身份验证的应用程序 在应用程序的索引页面中 我指定了这样的访问规则 public function accessRules return array array deny actions gt array index reg
  • iPhone - 如何从应用程序保存用户设置?

    将 iPhone 应用程序中的几个变量保存到长期内存中的最简单方法是什么 我有一个可与不同 sqlite 数据库配合使用的应用程序 我希望在退出应用程序后保存最后一个活动数据库名称 以便在用户再次进入应用程序时打开最后一个数据库 为此目的创
  • 为什么此 F# 函数需要括号?

    为什么需要括号read rest of csv below let read rest of csv csv data Add csv fileH ReadFields gt ignore not csv fileH EndOfData w