在尝试理解Clash.Prelude
中函数
withClockResetEnable
的用法时,我发现了这个函数的签名如下:
withClockResetEnable
:: forall dom r. KnownDomain dom
=> Clock dom
-> Reset dom
-> Enable dom
-> (HiddenClockResetEnable dom => r)
-> r
真正让我困惑的是这部分
-> (HiddenClockResetEnable dom => r)
下面有评论:
The function with a hidden Clock, hidden Reset, and hidden Enable argument
我的困惑是,我有限的知识告诉我,既然有一个
=>
,这条线可能表示类型约束,就像多态类型r
应该有一个HiddenClockResetEnable dom
的实例,这仍然没有意义我,我根本无法将此行链接到评论。
ImplicitParams
语言选项。
HiddenClockResetEnable
定义为:
type HiddenClockResetEnable dom = (HiddenClock dom, HiddenReset dom, HiddenEnable dom)
HiddenClock
等各个部分的定义如下:
type HiddenClock dom = (Hidden (HiddenClockName dom) (Clock dom), KnownDomain dom)
我们在
KnownDomain
的约束中有 withClockResetEnable
。那么什么是Hidden
?
type Hidden (x :: Symbol) a = IP x a
IP
类是ImplicitParams
语法脱糖的对象。所以原来的签名意思是:
withClockResetEnable
:: forall dom r. KnownDomain dom
=> Clock dom
-> Reset dom
-> Enable dom
-> ((?clock :: Clock dom, ?reset :: Reset dom, ?enable :: Enable dom) => r)
-> r
换句话说,如果您调用
withClockResetEnable c r e f
,并且 f
是一些隐式获取这些参数的计算,那么 withClockResetEnable
将使用隐式参数的这些参数调用 f
:
let
?clock = c
?reset = r
?enable = e
in f