我读了About `let 5 = 10`这个问题并且我没有在这里使用任何一个,在我的例子中我将代码写入文件并执行它,所以我的问题还没有回答,没有一个答案是对我有用。
我今天提出了一个关于[罕见模式匹配] [1]的类似问题,我们的一位朋友正在教我们Haskell中函数式编程的基础,他开始编写我见过的最稀有的东西:
他从不太开心的事情开始,但很酷:
(x,y) = (10,20)
(z:zs) = 0 : [1..]
并在前奏中显示:
prelude> x
10
prelude> z
0
prelude> takeN 3 zs
[1,2,3]
到目前为止,这么好......我不知道你可以像这样绑定值
(x,y) = (10,20)
(z:zs) = 0 : [1..]
True = False -- HERE
什么!班上的每个人都认为,好的,会出现问题,但是甚至编译的代码,然后运行:
prelude> x
10
prelude> 4
4
prelude> True
True
答案 0 :(得分:3)
where
和let
都使用 lazy 模式引入了定义方程式。
在任何模块中,所有顶级定义都在where
。
module Main where
-- ^^^^^
x, y :: Int
(x, y) = undefined
main :: IO ()
main = putStrLn "hello!"
上述程序将按预期打印“你好”。如果它是严格的,那么与(x, y)
匹配的模式会发生分歧,但由于它不是懒惰的,所以undefined
表达式永远不会被评估。
GHCi中输入的定义也属于隐式let
。
知道了这一点后,问题中提到的问题就是let 5 = 10
问题中的问题。
答案 1 :(得分:1)
在Haskell中,让“绑定”进行模式匹配。 Haskell中恰好有两种类型的模式匹配绑定:你可以写P = x
,其中P
是一个模式,或者你可以写v1 p1 p2 ... pn = x
每个pi
是一个模式图案。这定义了函数v1
的(部分)。什么是模式?
模式是变量v
,它使v
绑定到匹配成功时匹配的任何内容。或者模式可以是常数,如7,当匹配完成时,仅当匹配的事物等于常数时才成功。或者模式可以是数据类型的变体:如果Foo
是类型Bar
的变量(构造函数),则采用n个参数,然后是Foo p1 p2 ... pn
,其中pi
是patterns,是一种模式,它查看Bar
类型的对象,如果它是Foo
变体并且每个pi
成功匹配,则成功匹配。
因为Haskell是惰性的,所以强制模式匹配发生的唯一方法是使用受模式匹配约束的变量。因此,可以通过使用x
强制let (x,5)=(6,6)
x
let True = False
的绑定,这会导致匹配失败。如果变量没有参数,则无法强制匹配,因此匹配无法失败。因此True
如果你发生了匹配就会失败,但因为没有办法让匹配发生,所以没有错误。请注意,您不是重新绑定sass --watch src/file1.scss:dist/file1.css src/file2.scss:dist/file2.css
,而是将其用作没有参数的模式。