# 118: (Monad m) => Int -> m Int の Kind を推定できない [↑up](bunny_notes) - issued: 2020-12-11 - 分類: A サンプルコードが fail - status: Open ## 概要 以下のようなプログラムをコンパイルしようとすると、Kind の推定に失敗してエラーする: $$
{
$ cat returnint.hs
retInt :: (Monad m) => Int -> m Int
retInt = return

main = do
  x <- retInt 10
  print x
$$}

## 2021-10-27

全件確認中:

$$
{
unno@unno-FMVD70GN7G ~/work/bissues/118 
$ cat returnint.hs 
retInt :: (Monad m) => Int -> m Int
retInt = return

main = do
    x <- retInt 10
    print x
unno@unno-FMVD70GN7G ~/work/bissues/118 
$ runhaskell returnint.hs 
10
unno@unno-FMVD70GN7G ~/work/bissues/118 
$ ~/prj/bunny/compiler/bin/bunny testrun returnint.hs 
/home/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/returnint --xno-implicit-prelude /home/unno/prj/bunny/compiler/bin/../lib/Prelude.hs
/home/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/returnint --xlibrary-path /home/unno/prj/bunny/compiler/bin/../lib returnint.hs
warning: kiexpr' :AppTy (Tyvar (Name {origName = "m", namePos = (1,31), isConName = False})) (Tycon (Name {origName = "Int", namePos = (1,33), isConName = True})) []
bunnyc: Kind not infered ("m",[])
CallStack (from HasCallStack):
  error, called at src/Rename.hs:728:14 in main:Rename
CallStack (from -prof):
  Rename.kindLookup (src/Rename.hs:(727,1)-(728,77))
  Rename.renSigvar.k (src/Rename.hs:678:7-32)
  Rename.renSigvar (src/Rename.hs:(674,1)-(688,51))
  Rename.renDecls.renDecl (src/Rename.hs:(631,5)-(645,50))
  Rename.renDecls (src/Rename.hs:(583,1)-(645,50))
  Semant.renProg (src/Semant.hs:(21,1)-(52,11))
  Main.doCompile.(...) (app/Main.hs:83:7-70)
  Main.doCompile (app/Main.hs:(77,1)-(114,33))
  Main.main (app/Main.hs:(117,1)-(132,42))
testrun: failed to compile returnint.hs
$$}

## 2022-09-18

現象の確認。

$$
{
unno@Noether 118 % pwd
/Users/unno/work/bissues/118
unno@Noether 118 % cat returnint.hs
retInt :: (Monad m) => Int -> m Int
retInt = return

main = do
  x <- retInt 10
  print x

unno@Noether 118 % ~/prj/bunny/compiler/bin/bunny testrun returnint.hs
/Users/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/returnint --xno-implicit-prelude /Users/unno/prj/bunny/compiler/bin/../lib/Prelude.hs
/Users/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/returnint --xlibrary-path /Users/unno/prj/bunny/compiler/bin/../lib returnint.hs
warning: kiexpr' :AppTy (Tyvar (Name {origName = "m", namePos = (1,31), isConName = False})) (Tycon (Name {origName = "Int", namePos = (1,33), isConName = True})) []
bunnyc: Kind not infered ("m",[])
CallStack (from HasCallStack):
  error, called at src/Rename.hs:731:14 in main:Rename
testrun: failed to compile returnint.hs
$$}

当然ながら再現する。returnint を少し改変して、型注釈を省くと通る。

$$
{
unno@Noether 118 % cat returnint2.hs
retInt = return

main = do
  x <- retInt 10
  print x

unno@Noether 118 % ~/prj/bunny/compiler/bin/bunny testrun returnint2.hs
/Users/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/returnint2 --xno-implicit-prelude /Users/unno/prj/bunny/compiler/bin/../lib/Prelude.hs
/Users/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/returnint2 --xlibrary-path /Users/unno/prj/bunny/compiler/bin/../lib returnint2.hs
10
$$}

この種推論については、

- ${(->)} の各引数の種は ${*} である
- ${Int} の種は ${*} である

ことから、${Int - > m Int} の部分のみから ${m} の種は推定できるべきだろうから、
(種に関する調査をしなければ、というのではなく)修正方針は立てられそうなものだけど、
すっかり遠い過去に書いたコードになってしまっているので、当該ソースを読んできれいにするところから取り掛からないと。

”Kind not infered" と言っているのは、src/Rename.hs