IT練習ノート

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

Haskellのerrorで嵌る

次のような作りかけのコードを書いていました。errorの部分はあとで修正していくつもりでした。コーディングが進んで、errorの部分をコーディングする段階に来たのですが、show tの内容が出力されませんでした。

paramMetaData2TypeString_ (VAR   tipe len)      =
  case tipe of
    (VARLEN_BYTELEN_TYPE   t) ->
      case t of
        INTNTYPE -> case (lengthTYPE_VARLEN len) of
                        0x01 -> "tinyint"
                        0x02 -> "smallint"
                        0x04 -> "int"
                        0x08 -> "bigint"
        _          -> error  "not yet implemented. type=" ++ (show t)  -- TODO

結局errorの後に$が抜けているだけなのです。

ただ、$がなくてもタイプチェックになってしまうのが落とし穴でした。

 >
 > :t error
error :: [Char] -> a
 > error "foo"
*** Exception: foo
CallStack (from HasCallStack):
  error, called at <interactive>:25:1 in interactive:Ghci2
 > :t error "foo"
error "foo" :: a

> -- $をつけない

 > error "foo" ++ show "bar"
"*** Exception: foo
CallStack (from HasCallStack):
  error, called at <interactive>:27:1 in interactive:Ghci2
 > :t error "foo" ++ show "bar"
error "foo" ++ show "bar" :: [Char]

> -- $をつける

 > error $ "foo" ++ show "bar"
*** Exception: foo"bar"
CallStack (from HasCallStack):
  error, called at <interactive>:32:1 in interactive:Ghci2
 > :t error $ "foo" ++ show "bar"
error $ "foo" ++ show "bar" :: a
 >