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
关于Haskell中~和@运算符的问题_Haskell_Operator Keyword_Primes_Sieve - Fatal编程技术网

关于Haskell中~和@运算符的问题

关于Haskell中~和@运算符的问题,haskell,operator-keyword,primes,sieve,Haskell,Operator Keyword,Primes,Sieve,他们到底做什么?我知道@的一个可能用法(在模式匹配开始时指定一个名称),但在~上找不到任何内容 我在以下代码片段中找到了它们,摘自,但本文假设您精通Haskell语法,并且不需要解释其深奥的运算符(我感到困惑的部分是sieve声明的开始): primesPT()=2:primes' 哪里 素数'=筛[3,5..]素数'9 筛(p:xs)ps@((uu:t)q |p让f~(:t)=t在f[] ***异常::1:4-15:模式(\uT)的无可辩驳模式失败 运算符~使匹配延迟。通常,模式匹配会对参数进

他们到底做什么?我知道@的一个可能用法(在模式匹配开始时指定一个名称),但在~上找不到任何内容

我在以下代码片段中找到了它们,摘自,但本文假设您精通Haskell语法,并且不需要解释其深奥的运算符(我感到困惑的部分是sieve声明的开始):

primesPT()=2:primes'
哪里
素数'=筛[3,5..]素数'9
筛(p:xs)ps@((uu:t)q
|p
从本质上讲,
~(\uu:t)
将始终匹配,即使输入是空列表
[]
。当然,如果您不知道自己在做什么,这是危险的:

Prelude> let f ~(_:t) = t in f []
*** Exception: <interactive>:1:4-15: Irrefutable pattern failed for pattern (_ : t)
Prelude>让f~(:t)=t在f[]
***异常::1:4-15:模式(\uT)的无可辩驳模式失败

运算符
~
使匹配延迟。通常,模式匹配会对参数进行求值,因为需要检查模式是否失败。如果在模式前面加上
~
,则在需要之前不会求值。此功能通常在代码中使用,其中需要引用尚未使用c的结构已创建。如果模式在评估时失败,则结果为
未定义

以下是一个例子:

f (_:_) = True
f []    = False

g ~(_:_) = True
g []     = False
f[]
产生
False
,而
g[]
产生true,因为第一个模式总是匹配的。(实际上,您会收到此代码的警告)

这就是说,您可以将
~
视为
的对立面,这会强制对参数进行求值,即使它是不需要的

请注意,这些运算符仅在其应用的级别上严格/懒惰,而不是递归地。例如:

h ~((x,y):xys) = ...
元组上的模式匹配是严格的,但cons模式是懒惰的。

是查找不可搜索内容的好地方
h ~((x,y):xys) = ...