IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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

参考情報

24 Days of GHC Extensions: Implicit Parameters