OCaml:模式匹配与 If/else 语句

2023-12-29

因此,我对 OCaml 完全陌生,并且在实现第一个功能方面进展相当缓慢。我无法理解的一件事是何时使用模式匹配功能,例如

let foo = 
[] -> true
| _  -> false;;

与使用 if else 结构类似

let foo a = 
if a = [] then true else false;;

我应该什么时候使用它们?


我认为这个问题没有明确的答案。首先,模式匹配的明显情况是当您需要破坏时,例如:

let rec sum = function
    | [] -> 0
    | head :: tail -> head + sum tail;;

另一个明显的情况是,当您定义递归函数时,模式匹配使边缘条件更清晰,例如:

let rec factorial = function
    | 0 -> 1
    | n -> n * factorial(n - 1);;

代替:

let rec factorial = function n -> 
  if n = 0 then 
    1 
  else
    n * factorial(n-1);;

这可能不是一个很好的例子,只需发挥你的想象力来找出更复杂的边缘条件! ;-)

就常规(比如 C)语言而言,我可以说你应该使用模式匹配而不是switch/case and if代替三元运算符。对于其他一切来说,这都是一个灰色地带,但模式匹配在 ML 语言家族中通常是首选。

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

OCaml:模式匹配与 If/else 语句 的相关文章

  • 独立于符号的字符串的模式匹配

    我需要一种算法 可以在数据中找到预定义的模式 以字符串的形式存在 独立于数据和模式的实际符号 字符 我只关心符号之间的关系 而不关心符号本身 数据中的同一符号具有不同的模式符号也是合法的 模式匹配算法必须强制执行的唯一一件事是保留模式中同一
  • 有人可以解释一下这个 OCaml 程序中使用的类型语法吗?

    以下类型取自这个问题 https stackoverflow com q 50586942 633183 contains an error later fixed by the OP type task Success a gt a ta
  • 为什么要使用 Python 进行函数式编程?

    在工作中 我们过去常常以非常标准的面向对象方式来编写 Python 程序 最近 有几个人加入了功能性潮流 他们的代码现在包含更多的 lambda map 和reduce 我知道函数式语言有利于并发性 但是函数式 Python 编程真的有助于
  • 使用 ocaml List.fold_left 列表中的最后一个元素

    我可以通过以下代码找到列表的最后一个元素 let last xs a list a let rec aux xs prev match xs with gt prev x ys gt aux ys x in match xs with gt
  • 链接“let”语句时使用“and”还是“in”更好?

    我意识到这可能是一个愚蠢的问题 但是 如果我把一堆let不需要需要了解彼此价值观的语句 使用是否更好and or in 例如 以下哪一个更可取 如果有 let a foo and b bar and c baz in etc or let
  • Haskell/GHC:使用相同模式匹配多个一元构造函数

    所以我正在尝试定义 TrieSet 数据类型 尽管我知道我不需要 http hackage haskell org package TrieMap module Temp where import Data Map data TrieSet
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • 基于 True/False 值的 Python 优雅赋值

    我想根据三个布尔值中的值设置一个变量 最直接的方法是 if 语句后跟一系列 elif if a and b and c name first elif a and b and not c name second elif a and not
  • 什么样的函数被认为是“可组合的”?

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

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • PHP if in_array 表示多个值

    我有一个由 3 到 12 个值之间的任意位置生成的数组 它根据帐户信息生成该数组 result ad gt user gt groups user username 我想检查这个数组是否有多个值 大约 4 或 5 个 如果其中有任何一个值
  • 当函数中的模式匹配采用 &self 或 &mut self 时,如何避免使用 ref 关键字?

    铁锈书称为ref关键词 遗产 https doc rust lang org book ch18 03 pattern syntax html legacy patterns ref and ref mut 因为我想遵循隐含的建议来避免re
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • OCaml 中的不可变变量

    我正在学习 OCaml 我对变量的不变性有点困惑 根据我正在读的书 变量是不可变的 到目前为止一切顺利 但到底为什么我可以这样做 let foo 42 let foo 4242 我缺少什么 我认为最好的解释方法是举个例子 考虑以下代码 在
  • “功能性”Rust 对性能有哪些影响?

    我正在关注 Rust 轨道运动 io https exercism io 我有相当多的 C C 经验 我喜欢 Rust 的 功能 元素 但我担心相对性能 我解决了 行程编码 问题 https exercism io tracks rust
  • 是否可以只迭代一个流一次并执行 2 个或更多操作?

    给定代码 List
  • 创建新的保护子句

    在 Elixir 中 我将如何为函数创建新的保护子句 显然 我已经看到你不能只调用 a 中的任何函数when声明 但如果能够做这样的事情那就太好了 defmodule Player do def play card player do de
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

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

随机推荐

  • Angular2-router:如何仅更改路由的参数?

    我想在我的应用程序中有以下路线 export const routes Routes path universityId component UniversityComponent children path info component
  • C# 拆分数组

    我需要将一个大小不确定的数组在中点拆分为两个单独的数组 该数组是使用 ToArray 从字符串列表生成的 public void AddToList bool loop true string a Console WriteLine Ent
  • Google App Engine PHP SDK - 如何在 Ubuntu (15.10) 上安装?

    谷歌官方文档可以在这里找到 https cloud google com appengine downloads Google App Engine SDK for PHP https cloud google com appengine
  • grunt 执行停止批处理脚本

    我正在使用 cordova 和 yeoman angularjs 进行开发 我采用了如下的文件夹结构 在Windows上dir命令的输出 C code cordova pg droid app gt dir Volume in drive
  • 在 libgdx 中加载大背景的最佳方法

    我正在使用 libgdx 开发游戏 现在我想在我的地图上有一个背景 地图大小尚未固定 但我稍后会决定 我的地图是基于图块的 但我不使用 TiledMaps 所以我用自己的代码 编辑器创建并加载地图 我现在的问题是 我应该如何实现后台的东西
  • 在 Ansible 角色任务文件中使用 YAML 锚点

    我正在尝试创建一个 ansible 角色任务文件 其中包含多个重复部分 并且我想利用 YAML 的锚点功能 该功能允许跨文件共享数据 在我的实际文件中 我有 3 或 4 个属性需要在文件中的十几个任务中完全相同 因此锚点似乎是完美的解决方案
  • 使用 InputField 时隐藏虚拟键盘

    我知道如何使用隐藏或显示虚拟键盘InputMethodManager 但我想输入文字EditText使用物理键盘 但我不想在 Unity 3D Android 中显示虚拟键盘 我怎样才能在 Unity 3D 中做到这一点 不存在这样的事情E
  • 如何在 Cloud Dataflow 中使用 TextIO.Read 将多个文件与名称进行匹配

    我有一个 gcs 文件夹 如下所示 gs
  • 在 Swift 中,仅在对象的生命周期内调用一次方法

    假设我们覆盖scrollViewDidScroll方法和第一次滚动only 我们想doSomething 实现这一点的一个简单方法是拥有一个实例级布尔变量并切换 检查它 func scrollViewDidScroll scrollView
  • Dojo:在 required=false 时为 FilteringSelect 选择空值

    请看一下这段代码 dojo require dijit form FilteringSelect dojo require dojo store JsonRest dojo declare JsonFilteringSelect dijit
  • 结账时修改 Shopify 运费

    Is there a possibility that we could add a custom shipping price at checkout through an API call or script 我想根据一些规则修改价格
  • Array.isDefinedAt 用于 scala 中的 n 维数组

    有没有一种优雅的表达方式 val a Array fill 2 10 1 def do to elt i Int j Int if a isDefinedAt i a i isDefinedAt j f a i j 在斯卡拉 我建议您不要将
  • OpenXML - SpreadsheetReader 在当前上下文中不存在

    所以我试图复制这个答案使用 Openxml 2 0 在 Excel 中获取单元格背景颜色 https stackoverflow com questions 10756206 getting cell backgroundcolor in
  • 许可检查器的“已激活”状态的寿命。对于用户来说,多频繁才算过多?

    我的应用程序是一种袖珍指南 包含全年的一些数据 我假设用户将至少使用该程序一次并通过互联网访问来激活许可证 或者至少这是我对 Android 许可系统如何工作的理解 我正在使用服务器管理策略 它会定期检查许可证吗 有什么办法可以控制这个吗
  • 将 docker 卷挂载到 Windows 主机

    我正在我的 Windows 10 机器上运行 docker for windows 使用 hyper v 如果我运行以下命令 docker volume create test docker volume inspect test I ge
  • MongoDb 中的 $push 不起作用?

    我的架构如下所示 var exampleSchema newSchema profile experience exp String 这是更新个人资料收集中的经验的代码 exampleSchema statics experience fu
  • 如何在anjuta项目中包含资源文件

    我正在尝试更新 vala 中的图形项目 将大量代码行移动到 ui 文件中 我想使用模板 可用于 glib 2 38 和 GTK 3 8 类似的东西 我的项目是用 Anjuta 和 autoconf 管理的 In the src目录有 app
  • 如何在 PHP 中进行 URL 重写?

    我正在尝试在我的 PHP 应用程序中实现 URL 重写 有人可以分享一下在 PHP 和 MySQL 中实现 URL 重写的分步过程吗 在我的应用程序中 我想实现以下 URL 重写 我想重定向 1 http example com video
  • Firefox ... SVG ... 下划线...天哪?

    到目前为止 我尝试的任何方法都无法让 Firefox 在某些文本下划线 根据谷歌的结果 这个问题已知并记录了五年多 这不可能是真的 发生了什么事 有人知道任何持续有效的解决方法 甚至可能知道他们为什么还没有修复它的原因 我对此很好奇 Fir
  • OCaml:模式匹配与 If/else 语句

    因此 我对 OCaml 完全陌生 并且在实现第一个功能方面进展相当缓慢 我无法理解的一件事是何时使用模式匹配功能 例如 let foo gt true gt false 与使用 if else 结构类似 let foo a if a the