- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
let removeLow-6ren">
刚开始Haskell,据说Haskell中除了IO包之外的所有东西都是“不可变的”。那么当我将名称绑定(bind)到某个东西时,它总是不可变的?问题如下:
Prelude> let removeLower x=[c|c<-x, c `elem` ['A'..'Z']]
Prelude> removeLower "aseruiiUIUIdkf"
"UIUI"
所以这里:
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 如何命名它的所有名称?
谢谢。
最佳答案
如果您熟悉 C,请考虑声明变量和为其赋值之间的区别。例如,您可以单独声明一个变量,然后分配给它:
int i;
i = 7;
或者你可以声明一个变量并同时分配初始值:
int i = 7;
无论哪种情况,您都可以通过在第一次初始化或赋值后再次赋值来改变变量的值:
int i = 7; // Declaration and initial assignment
i = 5; // Mutation
Haskell 中的赋值工作方式与第二个示例类似 - 带初始化的声明:
我将“范围”加粗并加了超链接,因为它是这里的第二个关键组成部分。这是您的问题之一:
“removeLower" is an immutable? Even it's a function object? But I can still use "let" to assign something else to this name.
绑定(bind)后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
还是一样!因为foo
的“重新定义”不会改变任何东西——它只是说,在“重新定义”创建的新作用域中,名称 foo
代表三相加的函数。 bar
的定义是在早期范围内创建的,其中 foo x = x + 2
,这就是名字 foo
的意思bar
的定义中有。 foo
的原始值没有被“重新定义”破坏或变异。
在 Haskell 程序中和在 C 程序中一样,相同的名称仍然可以在程序的不同作用域中引用不同的值。这就是“变量”可变的原因。不同之处在于,在 Haskell 中,你永远无法在一个范围内改变变量的值。然而,您可以隐藏定义——变量的使用在某种意义上将引用该名称的“最近”定义。 (对于解释器,该变量的最新 let
声明。)
现在,抛开这些,下面是 Haskell 中存在的变量绑定(bind)(“赋值”)语法。首先,模块中有顶级声明:
module MyLibrary (addTwo) where
addTwo :: Int -> Int
addTwo x = x + 2
这里是名字addTwo
使用给定函数作为其值进行声明。顶级声明可以在 where
中包含私有(private)辅助声明。 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 ++ "!")
var <- action
分配一个由操作生成的值(例如,从标准输入读取一行),而 let var = expr
分配由函数生成的值(例如,连接一些字符串)。请注意 let
在 do
block 与 let ... in ...
不同。从上面看!
最后,在列表理解中,您将获得与 do
相同的赋值语法。 - 符号。
关于variables - "<-"是否意味着在 Haskell 中分配变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35198897/
我在 OS X 中构建菜单栏项时找到了一些示例代码。它使用了单个 |我不确定它的实际含义。 (我想做的是在菜单项左键单击时调用一个函数,但在右键单击时显示菜单) 这是我的代码 //Get refere
为什么它在第 23 行抛出编译错误。'a' 是 Apple 类的对象,col 是包含 Apple 对象的列表,但它仍然是抛出下面提到的编译错误: 类型 Collection 中的方法 add(capt
我有一个类A,它扩展了抽象类B。 让B有一个 protected 字段值 我想在 A 中使用这个字段。如果 A 没有 value,我可以编写 this.value 从 B 获取它。 与super.va
DBLint 用于检查数据库状态。有46条规则。在 www.dblint.org 上对每条规则都有一些简单的解释,但对规则 31 的描述如下: 定义的主键不是最小键:主键是最小的 super 键。如果
var aa: (()?) = (john.residence?.address = someAddress) var bb: ()? = john.residence?.printNumberOfR
我对 jquery 的可重用插件有点陌生。我已经多次遇到这段代码,但无法弄清楚究竟发生了什么。 (function( $ ){ ... })( jQuery ); 谁能帮我解答一下吗? 最佳答案
这个问题已经有答案了: int foo (int argc, ...) vs int foo() vs int foo(void) in C (4 个回答) 已关闭 9 年前。 所以我最近在 Hack
typedef struct Element { struct Element *next; void *data; } Element; 在 pop 函数中,(!(elem = *s
数据加载两次...意味着 AsyncTask onPostExecute 加载相同的数据两次?我的 AsyncTask onPostExecute 运行两次它加载相同的数据...我正在运行异步任务以从
运行“yomeanjs”时,我无限期地挂起“这可能需要几分钟”。当我尝试运行 grunt 时,它失败了,与 npm start 相同。 我使用的是 Win 8.1,并安装了最新的 Node 和 Mon
我正在看 big nerd ranch 的“Android Programming”中的这个页面,我对下面的句子感到困惑。它声明“当 Activity 被隐藏时, Activity 对象不存在”。这让
是否 const vector意味着它的元素是const也一样? 在下面的代码中, v[0].set (1234);在 void g ( const vector & v )产生编译器错误 const
我是 xml 相关事物的新手 我无法理解: SelectNodes(@"//Form/*[. = 'on']"); 注:SelectNodes是 XmlNode 的函数.(与 XmlDocument
我想方便地控制命令行参数。因此我想使用 ShellLib。 我的代码是这样的: ... #include ... EFI_STATUS EFIAPI UefiMain ( EFI_HANDL
着眼于更正 Debian 上/etc/init.d/hostapd 中的一个问题。但是,我不知道这行代码是做什么的,也不知道它是如何工作的 [ -n "$DAEMON_CONF" ] || exit
有没有人遇到过类似我下图所示的情况? 我有一个变量 landingBools.didSlowPast40Knots(正如您从调试打印输出中看到的那样)为假,但出于某种原因,if 语句评估为真。 知道为
我设法使用 flexbox 和一些非常基本的 JavaScript 为自己构建了三个下拉菜单。 因为我不太了解,所以我使用了一个简单的函数三次,而不是使用参数、变量和其他东西。我将其称为丑陋的“蛮力”
这周刚开始学习 javascript。我有一个非常菜鸟的问题。 exports.displayName = (undefined: ?string); 在 React Native 中意味着什么? 这
我正在阅读有关 NaN here 的内容它说: A comparison with a NaN always returns an unordered result even when compari
编码格式:引入*表示“从头开始重复”。例子。输入-{a,b,a,b,c,a,b,a,b,c,d}可以写成{a,b,*,c,*,d}。输出:5;例如2:ABCABCE,输出- 5。 这里*表示从头开始重
我是一名优秀的程序员,十分优秀!