私が持っているとしましょう:
f :: Double -> Double
f x = 3*x^2 + 5*x + 9
この関数の導関数を計算して書きたい
derivate f
となることによって
derivate f == \x -> 6*x + 5
しかし、どのように定義するのderivate
ですか?
derivate :: (a -> a) -> (a -> a)
derivate f = f' -- how to compute f'?
これを行うためのネイティブな方法がないことは承知していますが、それができるライブラリはありますか?
これを実現するには、「メタ」データ型に依存する必要がありますか?
data Computation = Add Exp Expr | Mult Expr Expr | Power Expr Expr -- etc
では、関数ごとに対応するコンストラクターを作成するのは面倒ではありませんか?ただし、データ型は関数を表すべきではありません(パーサーを除く)。
Pureは、用語書き換え機能があるため、優れた代替手段ですか?欠点もありませんか?
リストは手頃な価格ですか?
f :: [Double]
f = [3, 5, 9]
derivate :: (a -> [a])
derivate f = (*) <$> f <*> (getNs f)
compute f x = sum $
((*) . (^) x) <$> (getNs f) <*> f
getNs f = (reverse (iterate (length f) [0..]))
Haskellは、構文が適切でないLISPに依存しているように見えます。一緒に使用されるのを待っている関数と引数は、データ型にかなり格納されています。さらに、それはあまり自然ではありません。
derivate
それらは、同形異義語関数などの多項式以外の関数を実行できるほど「柔軟」ではないようです。
たとえば、今はゲームに派生物を使用したいと思います。キャラクターは機能を使って作られた床の上を走っていますが、床が十分に急な場合はスライドさせてもらいたいです。
また、さまざまな目的で方程式を解く必要があります。いくつかの例:
私は宇宙船で、昼寝をしたいです。睡眠中に注意深く身を置くと、重力のために惑星に衝突する可能性があります。天体から遠く離れるのに十分なガスがなく、地図もありません。ですから、私はこの領域のオブジェクトの間に身を置いて、それらの重力による私への影響の合計がキャンセルされるようにする必要があります。
x
とy
は私の座標です。gravity
は、2つのオブジェクトを受け取り、それらの間の重力のベクトルを返す関数です。私のほかに、地球と月の2つのオブジェクトがある場合、どこに行くかを見つけるために私がしなければならないのは、解決することだけです。
gravity earth spaceship + gravity moon spaceship == (0, 0)
新しい関数を最初から作成するよりもはるかに簡単で高速equigravityPoint :: Object -> Object -> Object -> Point
です。
私のほかに3つのオブジェクトがある場合でも、それは単純です。
gravity earth spaceship + gravity moon spaceship + gravity sun spaceship == (0, 0)
4、nについても同じです。オブジェクトのリストの処理は、この方法よりもはるかに簡単equigravityPoint
です。
他の例。私を撃つ敵ボットをコーディングしたい。彼が私の現在の位置を狙って撃っただけなら、私が私に向かって走れば彼は私を捕まえるでしょうが、私がジャンプして彼に落ちると彼は私を恋しく思うでしょう。より賢いボットは次のように考えています。「まあ、彼は壁から飛び降りました。彼が今いる場所をターゲットに撮影すると、それまで動いていたので、弾丸は彼を捕まえません。だから、彼がどこに行くのかを予想します。数秒以内に、弾丸と彼が同時にこのポイントに到達するように、そこで撃ちます。」基本的に、私は軌道を計算する能力が必要です。たとえば、この場合、trajectoryBullet == trajectoryCharacter
線と放物線が交わる点を与える、の解が必要です。
速度を含まない同様の単純な例。私は消防士のボットで、建物が燃えています。消防士の別のチームは、水鉄砲で火と戦っています。私はそうです、そしてからジャンプする人々がいます。友達が水を撃っている間、トランポリンを持っています。私は人々が落ちる前に人々が落ちるところに行く必要があります。だから私は軌道と方程式を解く必要があります。