117: defaultdouble.hs がランタイムにエラーする

↑up

概要

次のようなプログラムがランタイムにエラーする:

main = print (1 / 2)

エラーの様子は次のとおり:

$ ./trun testcases/defaultdouble.hs
# 1. tcompile
source file: testcases/defaultdouble.hs
dst dir: /defaultdouble
doCompile ... warning: kiexpr' :AppTy (Tycon (Name {origName = "Ratio", namePos = (265,17), isConName = True})) (Tycon (Name {origName = "Integer", namePos = (265,23), isConName = True})) []
warning: kiexpr' :AppTy (Tycon (Name {origName = "Ratio", namePos = (265,17), isConName = True})) (Tycon (Name {origName = "Integer", namePos = (265,23), isConName = True})) []
done.
implicitPrelude ... done.
doCompile ... warning: kiexpr' :AppTy (Tycon (Name {origName = "Ratio", namePos = (265,17), isConName = True})) (Tycon (Name {origName = "Integer", namePos = (265,23), isConName = True})) []
warning: kiexpr' :AppTy (Tycon (Name {origName = "Ratio", namePos = (265,17), isConName = True})) (Tycon (Name {origName = "Integer", namePos = (265,23), isConName = True})) []
done.
# 2. jout/compile
#!/bin/bash -v

target=$1
d=`dirname $1`

s=":"
if [ -d /c ]; then
    s=";"
fi

javac -J-Duser.language=en -cp "../../brt/src$s$d" $target
defaultdouble/Main.java:10: error: cannot find symbol
      Expr t4 = (Expr) new AtomExpr(new Dict(new Dict_36_Prelude_46_Integer_64_Prelude_46_Fractional()));
                                                 ^
  symbol:   class Dict_36_Prelude_46_Integer_64_Prelude_46_Fractional
  location: class Main
1 error

これは、現状では型検査器においては Num から Double への defaulting に対応しているのにたいして、後段の DictPass で対応していないことが原因と思われる。

(これは正確には「ランタイム」のエラーではないですね。java コンパイルの段階でエラーしている)

調査ログ

2020-11-29 (Sun)

ひとまず、DictPass が未対応である間は Double への defaulting をしないよう、型検査器の方も変更しておく:

--- a/compiler/src/Typing.hs
+++ b/compiler/src/Typing.hs
@@ -157,7 +157,7 @@ modify ce@ClassEnv{ceMap = m} i c = ce{ceMap = insert i c m}
 
 initialEnv :: ClassEnv
 initialEnv  = ClassEnv { ceMap    = empty
-                       , defaults = [tInteger, tDouble]}
+                       , defaults = [tInteger]}
 
 type EnvTransformer = ClassEnv -> Maybe ClassEnv

これで、defaultdouble.hs は型検査でエラーするようになった:

bunnyc: cannot resolve ambiguity: [(Tyvar "v8093" Star,[IsIn "Prelude.Fractional" (TVar (Tyvar "v8093" Star))])]

2021-10-27 (Wed)

全件確認中:

$ runhaskell t117.hs 
0.5
unno@unno-FMVD70GN7G ~/work/bissues/117 
$ ~/prj/bunny/compiler/bin/bunny testrun t117.hs 
/home/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/t117 --xno-implicit-prelude /home/unno/prj/bunny/compiler/bin/../lib/Prelude.hs
/home/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/t117 --xlibrary-path /home/unno/prj/bunny/compiler/bin/../lib t117.hs
bunnyc: cannot resolve ambiguity: [(Tyvar "v8777" Star,[IsIn "Prelude.Fractional" (TVar (Tyvar "v8777" Star))])]
testrun: failed to compile t117.hs
unno@unno-FMVD70GN7G ~/work/bissues/117 
$ cat t117.hs 
main = print (1 /2)