1

私は最近、この素晴らしいサイトから haskell を学んでおり、高階関数の章でパラメーターとして関数を渡すことについて学びました。関数をパラメーターとして渡すことが非常に便利であることがわかりますが、私の現在の (低レベルの) 理解から、この関数のパラメーターの量を指定する必要があり、この関数を考えるとかなり制限される可能性があります。

--takes a function and returns a function that has flipped arguments
flip' :: (a -> b -> c) -> (b -> a -> c) --very limited
flip' f = g
    where g x y = f y x

便利ですが、関数が 2 つのパラメーターを受け取る場合に限られますが、任意の量のパラメーターを持つ関数を受け入れる関数定義を作成する方法はありますか? 私の推測では、ある種のパラメーター リストである必要がありますが、それに関する情報が見つからないようです。ありがとう!

4

1 に答える 1

8

実際flipには 2 つ以上のパラメーターを持つ関数で動作しますが、必要なものとは異なる場合があります。

Prelude> :t (,,,)
(,,,) :: a -> b -> c -> d -> (a, b, c, d)
Prelude> :t flip (,,,)
flip (,,,) :: b -> a -> c -> d -> (a, b, c, d)

以来

(,,,) :: a -> b -> c -> d -> (a, b, c, d)

(,,,) :: a -> (b -> (c -> (d -> (a, b, c, d))))

最初の 2 つのパラメーターが反転します。ここaabですがbcですc -> d -> (a, b, c, d)

繰り返しになりますが、この例のように 3 つのパラメーター関数を反転することで、何を達成できると思いますか?

編集: また、vararg 関数があります。1 つの例はprintf. このHaskell.org のページはかなりいいです。要するに、この効果を実現するために、いくつかの型クラスの魔法を使用できます。

于 2013-06-15T03:15:04.937 に答える