15

多くのフィールドを持つデータ型があります。

data ManyFields a b c d .. = MF { f1 :: a, f2 :: b, f3 :: c .. }

問題1

各フィールドに関数を実装せずに、関数を各フィールドにマップするにはどうすればよいですmapか。たとえば、これは非常に退屈で非慣用的に見えます。

-- | Note I am explicitly constructing ManyField after mapping a function onto the field
-- | This looks bad
mapf1 :: (a -> a1) -> ManyFields a b c ..  -> ManyFields a1 b c ..
mapf1 g mf = MF (g . f1 $ mf) (f2 mf) ..

-- | Repeat for each field
mapf2 :: (b -> b1) -> ManyFields a b c .. -> ManyFields a b1 c ...

パターンを抽象化するある種の高次関数がconstructor . (mapfunction f)ボイラープレートを削減すると思いますが、より良い解決策はありますか?

問題 2

多くの ManyFields をまとめて圧縮し、任意のアリティの関数を各フィールドにマップしたい場合、これは何らかの型クラスのインスタンスになる可能性があるように聞こえますか?

使用事例:

(==) `mapFunction` mf1 `pairWiseZipField` mf2 

fmapそれは一種のアプリケーションのように見えますが、このタイプに実装する方法がわかりません。

4

1 に答える 1