最近社内Slackで江添さんのhaskellに纏わる誤解を説くbot化しています
++ でなく <> でリスト結合しないの? っていうサジェストをしなくなりましたね[a] に対する mappend の実装が
{-# INLINE mappend #-}
mappend = (++)
+ で文字列結合するよりビルダー経由で… っていうノウハウが逆転してしまうアレを連想してしまった(普通に [a] に対しては ++ でよいっぽい)++ を import Data.Monoid (<>) して書き換える必要なんてなかったんや…(つらい)++ よりも効率のよいビルダーがあるので、参考までに。(すでにご存じでしたら済みません)Show a 実装程度には ++ として、大規模にファイルとして出力する、あるいは pretty-print するとか AST みたいなデータ構造の場合にはビルダー使うっていうやり方してますねーmap より fmap の方がいいんじゃね?とも言われるし、てっきり多相関数の方がコンテナ型を変えたとき( [a] から Vector a に変えるとか)に楽だから言ってるのかと思ってた。map じゃなくて <$> つかいなよ も前のHlintにありましたね。
instance Functor [] where
{-# INLINE fmap #-}
fmap = map
<> で繋ぐようにコーディングする場合、意志的に左右の変数がそれこそ [a] でなく、ビルダーに置き換えたり newtype などで敢えて別のコンテナにした型として取り扱う予定があるとかになるでしょうね。 <$> についても同様(しかし、それだったらその必要なタイミングで書き直すので十分)hlint --ignore="Use fewer imports" --ignore="Use camelCase" とか[a] -> Either e a って関数の型をFunctorにする術ってあるのだろうか…newtype Foo e a = Foo([a] -> Either e a) したときに fmap :: (a -> b) -> Foo e a -> Foo e b と考えてやると何らかの方法で [b] -> Either e b な関数を作る必要がありますが、 [b] を [a] に変換して [a] -> Either e a に渡す方法が無いので無理な気がします(圏論わからないけど多分mizunashi様の言っていることと同じ)