Control.Applicative
のドキュメントでConst
が見つかったばかりですが、これは便利なところで働いていて、ちょうどMonoid
を使っています。'Const'アプリケーションファンクタとは何ですか?
私には何が欠けていますか?
Control.Applicative
のドキュメントでConst
が見つかったばかりですが、これは便利なところで働いていて、ちょうどMonoid
を使っています。'Const'アプリケーションファンクタとは何ですか?
私には何が欠けていますか?
Traversable
と組み合わせて使うとかなり役に立ちます。
getConst . traverse Const :: (Monoid a, Traversable f) => f a -> a
これは、たくさんのものを一緒に輝かせるための一般的なレシピです。 Applicative
をMonad
から分離する価値があることを私に納得させたのはユースケースの1つでした。私は自由変数の表現によってパラメータTraversable Term
のためのチェックを行うために発生する一般的なelem
elem :: Eq x => x -> Term x -> Bool
ようなものを必要としていました。私はTerm
の表現を変更し続けました。そして、効果的なマッピングではなく、いくつかが累積を行っていた膨大なトラバース関数を修正するのに疲れました。私は両方をカバーする抽象概念を見つけるのはうれしいです。
すべて(Applicative
)Functor
で機能する関数またはデータ構造を持ち、縮退した意味で再利用したい場合に便利です。与えられた関数で動作する関数にconst
またはid
を渡すのと似ています。
Van Laarhoven lenses任意ファンクタに関して定義され、そして(フィールドアップデータを導出し、Identity
等しく些細)フィールドアクセサを導出するConst
を使用しています。
Traversable
タイプは、これとは別の例です。
dave4420に記載されているように、Van Laarhovenレンズのアクセッサとアップデータを実装するには、Const
ファンクタが必要です。手の込んだするには:ガブリエル・ゴンザレスが指摘
{-# LANGUAGE Rank2Types #-}
import Control.Applicative
import Control.Monad.Identity
-- The definition of Van Laarhoven lenses:
type Lens a b = forall f . Functor f => (b -> f b) -> (a -> f a)
-- Getter passes the Const functor to the lens:
get :: Lens a b -> a -> b
get l = getConst . (l Const)
-- Updater passes the Identity functor to the lens:
modify :: Lens a b -> (b -> b) -> (a -> a)
modify l f = runIdentity . l (Identity . f)
set :: Lens a b -> b -> (a -> a)
set l r = modify l (const r)
-- Example: -------------------------------------------
data Person = Person { _name :: String, _age :: Int }
deriving Show
name :: Lens Person String
name f (Person n a) = fmap (\x -> Person x a) (f n)
age :: Lens Person Int
age f (Person n a) = fmap (\x -> Person n x) (f a)
main :: IO()
main = do
let john = Person "John" 34
print $ get age john
print $ set name "Pete" john
として、constがレンズにゲッターを提供するために使用されます。 http://hackage.haskell.org/package/lens-tutorial-1.0.0/docs/Control-Lens-Tutorial.html。そこでは、Constがファンクタであることだけを使用します。
トラバーサルについては、完全なアプリケーションの動作が必要で、別の回答で説明したpigworkerになります。
http://www.soi.city.ac.uk/~ross/papers/Applicative.htmlセクション4は、トラバーストリックの良い参考資料です。 –
foldingMap idは少ない制約で同じ結果を生成しません( 'Traversable'の代わりに' Foldable')? –
実際には、それは 'Foldable'が存在する理由です。しかし、 'Traversable'はすべて' Foldable'であることが、 'foldMapDefault'の構築であるという点で、むしろ有益です。プラグイン:SHEは 'DefaultSuperclassInstances'をサポートしています。そのため、Traversableはすべてデフォルトで' Foldable'になっています。 – pigworker