GHC User Guide の「 Implicit parameters and polymorphic recursion」の章について質問があります。
コードは
len1 :: [a] -> Int
len1 xs = let ?acc = 0 in len_acc1 xs
len_acc1 [] = ?acc
len_acc1 (_:xs) = let ?acc = ?acc + (1::Int) in len_acc1 xs
------------
len2 :: [a] -> Int
len2 xs = let ?acc = 0 in len_acc2 xs
len_acc2 :: (?acc :: Int) => [a] -> Int
len_acc2 [] = ?acc
len_acc2 (_:xs) = let ?acc = ?acc + (1::Int) in len_acc2 xs
章は言う
前者の場合、len_acc1 はそれ自体の右辺が単相であるため、暗黙のパラメーター ?acc は再帰呼び出しに渡されません。後者の場合、len_acc2 には型シグネチャがあるため、暗黙のパラメーターとして ?acc を取るポリモーフィック バージョンに対して再帰呼び出しが行われます。
質問は
この場合、「それ自体の右側で単形性」は型を意味し
len_acc1 :: (?acc :: Int) => [a] -> p
ますか? なぜghciは言うのlen_acc1 :: (?acc::Int) => [a] -> Int
ですか?なぜ最初の関数は単相的で、2 番目の関数はそうではないのですか? 私の理解が正しかったとしたら、その逆です。
または、型が であることを意味しているのかもしれませんが
len_acc1 :: [a] -> Int
、各ケースは?acc
暗黙的な値を参照しているため、型は(?acc :: Int)
制約について言及する必要があると思います。暗黙のパラメーターが関数に渡されないことをその単型性がどのように意味するのでしょうか?