Sum
とProduct
newtypesの私の理解は、数値型のためのモノイドラッパーとして機能するということです。私はそれらの上にFunctor
インスタンスを理解するだろうが、なぜまたApplicative
、Monad
他の多くの一見役に立たないインスタンスがありますか?私は彼らが数学的にはOKであることを理解しています(Identity
modadと同形です、右?)しかし、ユースケースは何ですか?たとえば、Applicative Sum
インスタンスがある場合は、どこかのタイプの値Sum (a -> b)
が発生することが予想されます。これがどこに役立つのかは想像もできません。SumとProductにApplicative/Monadインスタンスを使用するとは何ですか?
答えて
このような場合には、現在Sum
かProduct
中に住んですることが起こるもので動作するように任意の関数を持ち上げるために便利です。例えば、裸であるよりもSum
ではより便利な何かに対してビット単位の操作をしたいと思うかもしれません。 liftA2 (.&.) :: Sum Int -> Sum Int -> Sum Int
(たとえば)。
Sum
のインスタンスをBits
に与えることでこの操作を行うこともできますが、この手法を一般化するには、Sum
の実装者は、高い操作のように思われる操作をすべて予測する必要があります。 Applicative
とMonad
インスタンスを提供すると、ユーザが好きな機能を持ち上げるために、一度限りの翻訳が提供されます。Sum
の実装者は有用であるとは予測できませんでした。
はい、それは間違いなく 'Applicative'クラスの乱用です。この目的のために['Iso' combinators](http://hackage.haskell.org/package/lens-4.14/docs/Control-Lens-Iso.html)を使う方がはるかに優れています。 – leftaroundabout
@leftaroundabout「アイソ」コンビネータについてもっとよく話すことができますか? Naiveでは、これは奇妙なトレードオフのように見えます。それは非常に重い依存関係です(確かにベースにロールバックすべきではありません).2つ以上の引数を取り除く構文は、 'liftA2'の1つのアプリケーションと比較して冗長になります。 –
@leftaroundについて、私は 'au'と' auf'を見ると、私の目は曇っています。 – dfeuer
このような値は、通常、バイナリ演算子の部分的な適用によって発生します。
import Control.Applicative
import Data.Monoid
instance Functor Sum where
fmap f (Sum x) = Sum (f x)
instance Applicative Sum where
pure = Sum
(Sum f) <*> (Sum x) = Sum (f x)
ようFunctor
とApplicative
インスタンスと仮定すると、あなたはSum (a -> b)
の値が生じるであろうかを見ることができます。
> :t (*) <$> (Sum 5)
(*) <$> (Sum 5) :: Num a => Sum (a -> a)
> (*) <$> (Sum 5) <*> (Sum 10)
Sum {getSum = 50}
'Sum 5 * Sum 10'も' Num'インスタンスのために動作します。 – chi
- 1. バンドルIDの$ productとは何ですか
- 2. SUM(a * b)とは何ですか?
- 3. 組み込み関数sumはsum(list、[])と何をするのですか?
- 4. Bundle IdentifierとProduct Bundle Identifierの違いは何ですか?
- 5. pandas group by product by sumまたはcount
- 6. GreenDao querybuilderでSUMとDINSTINCTを使用するには?
- 7. CountとSumを同じクエリで使用するには?
- 8. サブクエリを使用するSUMとGROUP BY
- 9. Ruby on Rails: "form_for(:product、...)"と "form_for(@ product ...)"は同等ですか?
- 10. クラスのインスタンスをスーパー/ベースクラスとして使用する目的は何ですか?
- 11. MySQLでSUM()を使用するには?
- 12. このmysqlビューではsum演算子とは何ですか?
- 13. SQL Sum名とパーセントでデータベースに何回出現するか
- 14. sum()がvoidを返すとき、sum()+ sum()はCで有効ですか?
- 15. PhonegapとTitaniumを使用するメリットとデメリットは何ですか?
- 16. Ruby:モジュールでインスタンスを拡張するときに何かする
- 17. awkの出力は何ですか?BEGIN {sum = 0} END {print sum} 'filename?
- 18. __eq__とインスタンスを比較する理由は何ですか?
- 19. レンダリングはインスタンス変数と何をするのですか?
- 20. セレンに "xpath"を使用するメリットとデメリットは何ですか?
- 21. RowNumber()とSUM()を1つのクエリで使用する
- 22. SQLクエリ:DISTINCT/UNIQUEとSUM()を1つのステートメントで使用する
- 23. AnnotateとSumの中でDjango Subqueryを使用する方法
- 24. yii2のsum()と関連するフィールドでグループを使用
- 25. SUMをLOOKUP関数と一緒に使用する方法
- 26. Oracleと.NET:使用するDBとクライアントは何ですか?
- 27. Firebaseコンソールのクラッシュリプレットに影響を与えるインスタンスとユーザとは何ですか?
- 28. Product Index Django ORMを使用する
- 29. インスタンスの作成とパラメータとしてのインスタンスと作成インスタンスとの間のパラメータの違いは何ですか?
- 30. SQL ServerのSUM()に対応するものは何ですか?
私は同意します。これらの例は意味をなさないようです。 「できるから」という明確なケース。 – leftaroundabout
私は今GHCiにアクセスできないが、 'x :: Sum Int;のようなことをするために使うことができるかもしれない。 x = do {1; 2; 3; 4; 5} '? – bheklilr
@bheklilrそれは "働く"、そして "Sum"がアイデンティティモナドであるので "Sum 5"を返します。 – chi