Haskell / Clash 函数类型签名中不熟悉的语法

问题描述 投票:0回答:1

在尝试理解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
的实例,这仍然没有意义我,我根本无法将此行链接到评论。

haskell functional-programming clash
1个回答
0
投票

这是使用

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
© www.soinside.com 2019 - 2024. All rights reserved.