3 votes

Syntaxe inconnue en Haskell / signature de type de fonction Clash

En essayant de comprendre l'utilisation de la fonction withClockResetEnable dans Clash.Prelude, j'ai trouvé la signature de cette fonction comme ceci :

withClockResetEnable
  :: forall dom r. KnownDomain dom
  => Clock dom
  -> Reset dom
  -> Enable dom
  -> (HiddenClockResetEnable dom => r)
  -> r

La chose qui me cause vraiment de la confusion est cette partie

  -> (HiddenClockResetEnable dom => r)

qui a un commentaire ci-dessous : La fonction avec un argument Clock, Reset et Enable cachés

Ma confusion est, mes connaissances limitées me disent, puisqu'il y a un =>, cette ligne indique peut-être une contrainte de type, comme le type polymorphe r devrait avoir une instance de HiddenClockResetEnable dom, ce qui n'a toujours pas de sens pour moi, et je ne peux pas relier cette ligne au commentaire du tout.

2voto

Jon Purdy Points 19408

Ceci utilise l'option de langage ImplicitParams.

HiddenClockResetEnable est défini comme suit :

type HiddenClockResetEnable dom = (HiddenClock dom, HiddenReset dom, HiddenEnable dom)

Chacune des parties comme HiddenClock est définie de cette manière :

type HiddenClock dom = (Hidden (HiddenClockName dom) (Clock dom), KnownDomain dom)

Nous avons KnownDomain dans les contraintes sur withClockResetEnable. Alors, que représente Hidden ?

type Hidden (x :: Symbol) a = IP x a

La classe IP est à quoi la syntaxe ImplicitParams est desugérée. Ainsi, la signature d'origine signifie :

withClockResetEnable
  :: forall dom r. KnownDomain dom
  => Clock dom
  -> Reset dom
  -> Enable dom
  -> ((?clock :: Clock dom, ?reset :: Reset dom, ?enable :: Enable dom) => r)
  -> r

En d'autres termes, si vous appelez withClockResetEnable c r e f, et que f est un calcul qui prend implicitement ces paramètres, alors withClockResetEnable appellera f avec ces arguments pour les paramètres implicites :

let
  ?clock = c
  ?reset = r
  ?enable = e
dans f

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X