“<-”是否意味着在Haskell中分配变量?

2024-03-10

刚开始Haskell,据说Haskell中除了IO包之外的所有东西都是“不可变的”。那么当我将名称绑定到某个东西时,它总是不可变的?问题,如下:

Prelude> let removeLower x=[c|c<-x, c `elem` ['A'..'Z']]
Prelude> removeLower "aseruiiUIUIdkf"
"UIUI"

So here:

1. “removeLower" is an immutable? Even it's a function object?
But I can still use "let" to assign something else to this name.

2. inside the function "c<-x" seems that "c" is a variable.
It is assigned by list x's values.

我使用 C 语言中的“变量”一词,不知道 Haskell 如何命名它的所有名称?

Thanks.


如果您熟悉 C,请考虑以下之间的区别:宣告一个变量和指派对它的价值。例如,您可以单独声明一个变量,然后分配给它:

int i;
i = 7;

或者你可以声明一个变量并同时分配初始值:

int i = 7;

无论哪种情况,您都可以mutate第一次初始化或赋值后再次赋值给变量的值:

int i = 7;  // Declaration and initial assignment
i = 5;      // Mutation

Haskell 中的赋值工作方式与第二个示例类似——带有初始化的声明:

  1. 你声明一个变量;
  2. Haskell 不允许未初始化的变量,因此您需要在声明中提供一个值;
  3. 没有突变,因此声明中给出的值将是该变量在其整个过程中的唯一值scope https://en.wikipedia.org/wiki/Scope_(computer_science).

我将“范围”加粗并加了超链接,因为它是这里的第二个关键组成部分。这就是你的问题之一:

“removeLower”是不可变的?即使它是一个函数对象?但我仍然可以使用“let”为该名称分配其他内容。

绑定后removeLower您在示例中定义的函数的名称removeLower将始终引用该函数在该定义的范围内。这很容易在解释器中演示。首先我们定义一个函数foo:

Prelude> let foo x = x + 2
Prelude> foo 4
6

现在我们定义一个bar使用foo:

Prelude> let bar x = foo (foo x)
Prelude> bar 4
8

现在我们“重新定义”foo到不同的东西:

Prelude> let foo x = x + 3
Prelude> foo 4
7

现在你认为会发生什么bar?

Prelude> bar 4
8

它仍然是一样的!因为“重新定义”foomutate任何东西——它只是说,在“重新定义”创建的新范围内, 名字foo代表三相加的函数。的定义bar是在早期范围内进行的,其中foo x = x + 2,这就是名字的意思foo该定义中有bar。的原始值foo没有被“重新定义”破坏或变异。

在 Haskell 程序中和在 C 程序中一样,相同的名称仍然可以在程序的不同作用域中引用不同的值。这就是“变量”可变的原因。不同之处在于,在 Haskell 中,你永远无法在一个范围内改变变量的值。你可以shadow然而,定义——变量的使用在某种意义上将引用该名称的“最近”定义。 (就口译员而言,最新的let该变量的声明。)


现在,抛开这些,下面是 Haskell 中存在的语法:变量绑定(“任务”)。首先,模块中有顶级声明:

module MyLibrary (addTwo) where

addTwo :: Int -> Int
addTwo x = x + 2

这里是名字addTwo使用给定函数作为其值进行声明。顶级声明可以有私有的辅助声明where block:

addSquares :: Integer -> Integer
addSquares x y = squareOfX + squareOfY
  where square z = z * z
        squareOfX = square x
        squareOfY = square y

然后就是let ... in ...表达式,允许您为任何表达式声明局部变量:

addSquares :: Integer -> Integer
addSquares x y = 
  let square z = z * z
      squareOfX = square x
      squareOfY = square y
  in squareOfX + squareOfY

然后就是do- 具有自己的声明变量语法的符号:

example :: IO ()
example = do
  putStrLn "Enter your first name:"
  firstName <- getLine

  putStrLn "Enter your lasst name:"
  lastName <- getLine

  let fullName = firstName ++ " " ++ lastName
  putStrLn ("Hello, " ++ fullName ++ "!")

The var <- action分配一个由产生的值action(例如,从标准输入读取一行),而let var = expr分配一个由 a 产生的值function(例如,连接一些字符串)。请注意,let in a do块与块不是同一件事let ... in ...从上面!

最后,在列表理解中,您将获得与以下相同的赋值语法do-符号。

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

“<-”是否意味着在Haskell中分配变量? 的相关文章

  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • 检查多个变量java中的替换空值

    我试图找到一种简单的方法来在 Java 中的多个变量中执行多个 null 检查 替换 我有一个包含大约 20 个字符串变量的对象 在构造函数中 我想检查是否有任何变量值为空 如果它们为空 我想用空字符串替换它们 我可以执行一系列 if 语句
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • 创建具有动态更新变量的数组

    我有一些 PHP 变量 它们的名称直接链接到它们包含的函数 是否有办法自动创建这些变量 以便我可以使用所有变量 00 200 这就是我现在正在做的事情 regdays00 is user reg matured 00 regdays02 i
  • 变量值更改时的 PyQt 事件

    我有一个变量 t t 0 我想在 t 值发生变化时启动一个事件 如何 没有 valuechanged connect 属性或任何变量 对于全局变量 单独使用赋值是不可能的 但对于属性来说非常简单 只需使用property https doc
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • 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 / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

    我正在尝试对类型列表进行排序 String Int 默认情况下 它按字符串排序 然后按整数排序 如果字符串相等 我希望它是相反的 首先比较整数 然后如果相等则比较字符串 另外 我不想切换到 Int String 我找到了一种通过定义实例来实
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • php如何生成动态list()?

    根据我的理解 这就是 list 的工作原理 list A1 A2 A3 array B1 B2 B3 所以在帮助下list 我们可以相应地从数组中分配值 这是我的问题 如何生成动态list 1 基于数据库返回结果 我不确定有多少 但我将其全
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完

随机推荐

  • 转换集合

    有一个对象的集合 示意图 A 1 B 1 A 1 B 2 A 2 B 3 A 2 B 4 A 1 B 5 A 3 B 6 Need A 1 Bs 1 2 A 2 Bs 3 4 A 1 Bs 5 A 3 Bs 6 可以这样 LINQ 吗 No
  • UITextView 触摸事件未触发

    我有一个UITextView我想检测一次点击 看起来我只需覆盖就可以了touchesEnded withEvent并检查 touches anyObject tapCount 1 但是这个事件甚至没有触发 如果我像这样重写 4 个事件 vo
  • 如何修复:预期具体生命周期,但发现绑定生命周期参数

    我目前正在听这个问题 我试图将其缩小到最小的可重现示例 struct Request struct ResponseWriter lt a gt dummy a deriving Clone pub struct RouteStore pu
  • 为什么 MIPS 中 bgezal 和 bltzal 是基本指令而不是伪指令?

    根据这个MIPS指令参考 http www weblearn hs bremen de risse RST docs MIPS mips isa pdf 有两条指令 bgezal and bltzal 如果分支被采用 则执行相对跳转和链接
  • 更改 .NET 应用程序配置文件名

    我有一个调用 NET 程序集的 VB6 应用程序 该程序集引用 app config 文件中的设置 默认情况下 NET 查找以 VB6 应用程序命名的配置文件 如何将其重定向以使用不同的配置文件名 这需要成为默认配置文件 以便例如从中读取
  • 如何从apache Spark框架读取XML文件?

    我确实在这里遇到了一个使用 Spark 进行数据预处理的迷你教程 http ampcamp berkeley edu big data mini course featurization html http ampcamp berkeley
  • 如何在 pandas 中旋转分类变量?

    如何透视这些数据 date low up d1 a A d1 b B d2 c C 进入这个 low a b c date d1 A B NaN d2 NaN NaN C 我正在使用pivot table pivot 但它总是要求输入数字
  • 矩阵的边界值问题

    问题 我需要将 P 矩阵的每个元素限制在 1 1 范围内 我已经使用了代码最小最大检查 http www mathworks in matlabcentral fileexchange 43251 bound values of an ar
  • 向 scatter3d 图添加图例

    rgl 是交互式 3D 绘图的可能软件包之一 我想做的是根据一些因子变量构建带有颜色编码的 3D 散点图 3D 维度散点图用于 plsr 分析产生的载荷 结果图看起来像 The 示例数据在表中给出 gt loadings Comp 1 Co
  • 如果我尝试打开 PWM 引脚,Windows 10 Iot Core 应用程序会崩溃

    我想为我的蜂鸣器打开一个 PWM 引脚 但如果我尝试打电话给pwmController OpenPin 6 方法 应用程序崩溃并显示System Runtime InteropServices SEHException 我已经仔细检查过示例
  • 尝试复制大文件时出现 NIO 错误

    我有将文件复制到另一个位置的代码 public static void copyFile String sourceDest String newDest throws IOException File sourceFile new Fil
  • 如何获取终端结果并设置 JTextArea 来读取终端?

    我最近完成了一个 GUI 用户可以在其中输入标准 并获得符合所述条件的结果 该程序的工作结果明智 但我无法让我的 GUI 中的文本字段读取我的终端窗口结果 我的 GUI 代码如下 package project205 import java
  • iOS 静默推送通知仅在连接到 xcode 时有效

    我有一个奇怪的问题 我最近将 Xcode 更新到 6 1 1 以对我之前使用 Xcode 5 发布的应用程序进行更改 运行良好 现在 由于某种原因 当我使用新的 Xcode 测试后台静默推送通知时 它只有在我的 iPhone 连接到 Mac
  • 在 Dart 中合并两个对象列表

    我有具有参数名称和参数计数器的对象 这些对象存储在列表中 我的列表中的某些项目具有重复的参数 名称 我想删除列表内的重复项 并将该重复项的计数器添加到重复对象参数中 class Person Person this name this co
  • 对于大输入返回负数的阶乘函数

    我的阶乘函数似乎适用于 1 到 6 之间的数字 但不适用于大于 6 的数字 例如从 21 开始 结果是否定的 我不明白为什么 这是我的功能 factorial Int gt Int factorial 0 1 factorial 1 1 f
  • Apache Flink 检查点卡住

    我们正在运行一个 ListState 介于 300GB 到 400GB 之间的作业 并且有时该列表可能会增加到数千 在我们的用例中 每个项目都必须有自己的 TTL 因此我们使用 S3 上的 RocksDB 后端为此 ListState 的每
  • for 循环后的 Python 语法错误(在解释器中)

    我正在从控制台运行一些 python 代码 粘贴 并得到意外的结果 代码如下所示 parentfound False structfound False instruct False wordlist fileHandle open con
  • 如何获取 ImageView 中 Drawable 的尺寸? [复制]

    这个问题在这里已经有答案了 检索 ImageView 中 Drawable 尺寸的最佳方法是什么 My ImageView有一个初始化方法 我在其中创建ImageView private void init coverImg new Ima
  • 在 C++ 中使用 new 创建引用

    我有以下代码 似乎用 new 创建引用是可以的 但是当用 new 创建对象时 当我尝试重新收集分配的内存时 它会崩溃 float f new float 1 3 delete f float f1 new float delete f1 我
  • “<-”是否意味着在Haskell中分配变量?

    刚开始Haskell 据说Haskell中除了IO包之外的所有东西都是 不可变的 那么当我将名称绑定到某个东西时 它总是不可变的 问题 如下 Prelude gt let removeLower x c c lt x c elem A Z