Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 是不是<-&引用;是指在Haskell中指定一个变量吗?_Variables_Haskell_Immutability_Assign - Fatal编程技术网

Variables 是不是<-&引用;是指在Haskell中指定一个变量吗?

Variables 是不是<-&引用;是指在Haskell中指定一个变量吗?,variables,haskell,immutability,assign,Variables,Haskell,Immutability,Assign,刚开始使用Haskell,据说Haskell中除了IO包之外的所有东西都是“不可变的”。所以当我把一个名字绑定到某个东西上时,它总是不可变的?问题如下: Prelude> let removeLower x=[c|c<-x, c `elem` ['A'..'Z']] Prelude> removeLower "aseruiiUIUIdkf" "UIUI" Prelude>let removeLower x=[c | c removeLower“aseuiuidkf” “UIU

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

Prelude> let removeLower x=[c|c<-x, c `elem` ['A'..'Z']]
Prelude> removeLower "aseruiiUIUIdkf"
"UIUI"
Prelude>let removeLower x=[c | c removeLower“aseuiuidkf”
“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.
1.“removeLower”是不可变的?即使它是一个函数对象?
但我仍然可以使用“let”为这个名称指定其他内容。

2.在函数“c中,它指的是一元绑定操作符
>=
。您不需要显式地编写lambda作为右侧参数。列表压缩将编译为定义的一元操作。这意味着与一元环境中完全相同

事实上,您可以使用对
过滤器的简单调用来替换列表压缩:

filter (`elem` ['A' .. 'Z']) x
回答您关于


是一个谓词,应用于理解中
c
的每个后续绑定,输入元素只有通过该谓词时才会出现在输出列表中。

如果您熟悉c,请考虑声明变量和为其赋值之间的区别。例如,您可以声明变量e自行分配,然后分配给它:

int i;
i = 7;
或者,您可以声明一个变量并同时指定初始值:

int i = 7;
在这两种情况下,您都可以通过在第一次初始化或赋值后再次赋值来对变量的值进行变异:

int i = 7;  // Declaration and initial assignment
i = 5;      // Mutation
Haskell中的赋值仅与第二个初始化示例声明类似:

  • 你声明了一个变量
  • Haskell不允许未初始化的变量,因此需要在声明中提供一个值
  • 没有变异,因此声明中给出的值将是该变量在整个过程中的唯一值
  • 我将“范围”加粗并超链接,因为它是这里的第二个关键组件。下面是您的一个问题:

    “removeLower”是一个不可变的?即使它是一个函数对象?但我仍然可以使用“let”为这个名称指定其他名称

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

    Prelude> let foo x = x + 2
    Prelude> foo 4
    6
    
    Prelude> let bar x = foo (foo x)
    Prelude> bar 4
    8
    
    现在我们定义一个使用
    foo
    条:

    Prelude> let foo x = x + 2
    Prelude> foo 4
    6
    
    Prelude> let bar x = foo (foo x)
    Prelude> bar 4
    8
    
    现在我们将foo重新定义为不同的东西:

    Prelude> let foo x = x + 3
    Prelude> foo 4
    7
    
    现在您认为
    条会发生什么变化

    Prelude> bar 4
    8
    
    它仍然是一样的!因为
    foo
    的“重新定义”在“重新定义”所创建的新范围内不会改变它所说的任何东西",名称
    foo
    代表增加三个的功能。
    bar
    的定义是在前面的范围中定义的,其中
    foo x=x+2
    ,因此这就是名称
    foo
    bar
    的定义中的含义。
    foo
    的原始值没有被e“重新定义”

    在Haskell程序和C程序中一样,相同的名称仍然可以在程序的不同作用域中引用不同的值。这就是“变量”的含义变量。不同之处在于,在Haskell中,您永远不能在一个范围内对变量的值进行变异。您可以隐藏定义,但在某种意义上,变量的使用将引用该名称的“最近”定义。(对于解释器,是该变量的最新
    let
    声明。)


    现在,这里是Haskell中用于变量绑定(“赋值”)的语法。首先,模块中有顶级声明:

    module MyLibrary (addTwo) where
    
    addTwo :: Int -> Int
    addTwo x = x + 2
    
    此处,名称
    addTwo
    以给定函数作为其值进行声明。顶级声明可以在
    块中包含私有的辅助声明,其中
    块:

    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 ++ "!")
    
    示例::IO() 示例=do putStrLn“输入您的名字:”
    firstName我喜欢认为,如果我看到它,我会拉出一个值^^“,但我仍然可以使用“let”为这个名称指定其他内容。”-确切地说,你可以指定名称,而不是值。这与任何方式的变异都不对应。调用
    c
    变量很好-它的值确实不同。在我看来,最好是编写
    [c | c@Carsten是的,我知道你的意思。我会改变它。但我必须承认我不使用列表理解。
    
    module MyLibrary (addTwo) where
    
    addTwo :: Int -> Int
    addTwo x = x + 2
    
    addSquares :: Integer -> Integer
    addSquares x y = squareOfX + squareOfY
      where square z = z * z
            squareOfX = square x
            squareOfY = square y
    
    addSquares :: Integer -> Integer
    addSquares x y = 
      let square z = z * z
          squareOfX = square x
          squareOfY = square y
      in squareOfX + squareOfY
    
    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 ++ "!")