了解绑定和模式匹配

时间:2017-12-28 15:30:17

标签: haskell binding pattern-matching bind

我读了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

2 个答案:

答案 0 :(得分:3)

wherelet都使用 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 ,而是将其用作没有参数的模式。