在haskell中重新定义函数

时间:2018-08-01 10:33:31

标签: haskell

Is this right or bug?

我读了这篇文章。

  

这是一个常见模式的非常简单的示例,您会在整个Haskell中看到。制作显然正确的基本功能,然后将它们组合为更复杂的功能。这样,您还可以避免重复。如果某些数学家认为2实际上是3并且您必须更改程序该怎么办?您只需将doubleMe重新定义为x + x + x,并且由于doubleUs调用doubleMe,它将自动在2为3的这个陌生的新世界中工作。

当我调用doubleUs 3 4时,它应该返回21,因为我重新定义了doubleMe函数,但是该函数返回了14

2 个答案:

答案 0 :(得分:6)

本文并不是要在程序中具有相同功能的两个定义的情况下,后者会覆盖前者。谈论进入您的Haskell文件并用新的替换旧的定义。

通常,您根本无法在同一范围内定义两个具有相同名称的函数。您在GHCi中编译的代码是因为您输入到GHCi中的每个定义都被视为自己的let语句,因此它将启动一个新的作用域。因此doubleUs使用了doubleMe的旧定义,因为新定义位于doubleUs无法访问的不同范围内(而且Haskell在词法上是范围内的,因此内部范围内的定义不会不会影响外部范围的功能)。如果您将该代码输入到Haskell文件中并尝试使用GHC进行编译,则会收到有关无法到达的情况的警告,因为doubleMe的两个定义都将被视为具有两个重叠模式的单个定义。 / p>

答案 1 :(得分:1)

您必须再次执行select count(*) from (select cid from dbo.MyTable where AccountId in ('E7888A78-043F-4C34-BB72-1EDC97D32EDB', 'CC94E667-7776-4427-A6D9-6492C5CDA617') group by cid having count(distinct AccountId) > 1 ) t;