IT練習ノート

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

fmapできない型

ProtocolBufferのパッケージ内にUtf8という型があります。

https://hackage.haskell.org/package/protoc…

これは、StringBufferで表現されたデータが有効なUtf8であることを示した目印をつけたものです。

この、目印がつけられたデータに対して処理を考えた時に、

1. 目印を剥がして、
2. 処理をして、
3. また目印をつける

というのは面倒です。

fmapはコンテナの内部に直接働きかけることができます。しかし、単に目印をつけた型の場合はfmapが定義できません。

カインドを確認すると

 > :k Maybe
Maybe :: * -> *
 > :k PB.Utf8
PB.Utf8 :: *
 >

です。

なので、Utf8Functorにしようとするとコンパイルエラーとなります。

 > instance Functor PB.Utf8 where fmap = undefined

<interactive>:297:18: error:
    • Expected kind ‘* -> *’, but ‘PB.Utf8’ has kind ‘*’
    • In the first argument of ‘Functor’, namely ‘PB.Utf8’
      In the instance declaration for ‘Functor PB.Utf8’
 >

目印を剥がして、付け直す仕組みはどうすればいいのか??