055: showList のデフォルト実装ではエラー

↑up

概要

showList について、class Show のデフォルト実装ではエラーするので、 Int, Integer それぞれに特殊実装を書いて回避している。

deriving Show は実現するまえに、この件対処が必要。

instance Show Integer where
  show = Prim.integerShow
  showList xs = (++) (showlist' xs)
    where showlist' [] = "[]"
          showlist' [x] =  "[" ++ Prim.integerShow x ++ "]"
          showlist' (x:xs) = "[" ++ foldl (\s t -> s ++ "," ++ Prim.integerShow t) (show x) xs ++ "]"

instance Show Int where
  show = Prim.intShow
  showList xs = (++) (showlist' xs)
    where showlist' [] = "[]"
          showlist' [x] =  "[" ++ Prim.intShow x ++ "]"
          showlist' (x:xs) = "[" ++ foldl (\s t -> s ++ "," ++ Prim.intShow t) (show x) xs ++ "]"

調査ログ

2020-05-08 (Fri)

以下のようにすると、showlogs' が多相になる:

instance Show Integer where
  show = Prim.integerShow
  showList xs = (++) (showlist' xs)
    where showlist' [] = "[]"
          showlist' [x] =  "[" ++ show x ++ "]"
          showlist' (x:xs) = "[" ++ foldl (\s t -> s ++ "," ++ show t) (show x) xs ++ "]"
          -- showlist' :: [Integer] -> [Char]   

そのときの Core をみると、辞書の解決がなんか変な気がする。

小さいテストケースで再現したので、そちら(067)で調査しよう。

解決

067 対処により、本件も解決。lib/Prelude.hs を修正して、クローズ。