我试图弄清楚Haskell是使用动态还是静态范围.我意识到,例如,如果你定义:
let x = 10
然后定义功能
let square x = x*x
你有2个不同的"x",这是否意味着它是动态范围的?如果没有,它使用什么范围,为什么?
此外,Haskell变量是否具有别名(相同内存位置/值的不同名称)?
谢谢.
Haskell(大体上说)使用与大多数其他语言完全相同的词汇范围.
例如.
x = 10
x
导致在全局范围中引用的值,而
square x = x * x
将导致x
词法范围到功能方块.如果您认为上述形式是一种语法精确,它可能会有所帮助:
square = \ x -> x * x
至于你的另一个问题,我不确定你的别名是什么意思
你的陈述有些不对劲......
Haskell中没有可变变量只是定义(或不可变变量)
可变内存位置是Haskell中不存在的概念
在你的榜样,X是不是 10的功能仅仅是广场,可以采取任何值参数在这种情况下,10只是在这种情况下(可以指定稍后的类型).
以下是Curt Sampson提供的别名示例:
import Data.IORef main :: IO () main = do x <- newIORef 0 -- write 0 into x readIORef x >>= print -- x contains 0 let y = x readIORef y >>= print -- y contains 0 writeIORef x 42 -- write 42 into x readIORef y >>= print -- y contains 42
仅回答问题的第二部分:
对于相同的"内存位置",您可以有多个别名,但由于它们都是不可变的,因此大多数情况下并不重要.
愚蠢的例子:
foo x y = x * y bar z = foo z z
当内foo
从叫bar
,都x
和y
显然是相同的值.但既然你不能修改,x
或者y
你甚至都不会注意到.