我读了这篇文章。
这是一个常见模式的非常简单的示例,您会在整个Haskell中看到。制作显然正确的基本功能,然后将它们组合为更复杂的功能。这样,您还可以避免重复。如果某些数学家认为2实际上是3并且您必须更改程序该怎么办?您只需将
doubleMe
重新定义为x + x + x
,并且由于doubleUs
调用doubleMe
,它将自动在2为3的这个陌生的新世界中工作。
当我调用doubleUs 3 4
时,它应该返回21
,因为我重新定义了doubleMe
函数,但是该函数返回了14
。
答案 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;
。