Implicit Parameters
Clash
のプログラミングでサンプルを作り始めたところ、?変数名 :: 型
というシグネチャが出てきました。
*> :t notM notM :: (?rst::Reset domain synchronous, ?clk::Clock domain gated) => Signal domain Bool -> Signal domain Bool
Implicit Paremters
という機能でした。
https://www.haskell.org/hugs/pages/users_guide/implicit-parameters.html
Readerモナドに似た挙動をするようです。
まずは、このような関数を考えてみます。
*> let foo = (*2) . (+2) *> :t foo foo :: Num c => c -> c *> foo 1 6 *> foo 2 8 *> foo 3 10
次に、上の関数の実装内で2つあった関数((*2)
と(+2)
)の1番目の関数を、パラメータとして外出しします。
*> let foo' z = z . (+2) *> :t foo' foo' :: Num b => (b -> c) -> b -> c *> foo' (*2) 1 6 *> foo' (*2) 2 8 *> foo' (*2) 3 10
さらに、上の関数で外出ししたパラメータを暗黙化します。
*> let foo'' = undefined :: (Num a, ?z::a->a) => a -> a *> let foo'' = let ?z=(*2) in ?z . (+2) :: (Num a, ?z::a->a) => a -> a *> foo'' 1 6 *> foo'' 2 8 *> foo'' 3 10
参考情報