13

mean次のように定義された関数があるとします。

mean xs = sum xs / (fromIntegral $ length xs)

しかし、私は次のような暗黙の形でそれを望んでいます:

mean = sum / (fromIntegral . length)

私自身のtacit関数を構築することなく、これらの行に沿って何かを行う組み込みのHaskellの方法はありますか(このようなもの):

tacit :: (a -> b -> c) -> (d -> a) -> (d -> b) -> d -> c
tacit a b c i = a (b i) (c i)

この形式では、関数は次のようになります。

mean = tacit (/) sum (fromIntegral . length)

しかし、このような明示的な関数を使用する必要を回避する方法があるように感じます. ちょっと思ったんです; Haskellに組み込まれているこれを行う方法はありますか?

4

2 に答える 2

20

ここでは、適用可能なファンクターが非常にうまく機能します。

import Control.Applicative

mean = (/) <$> sum <*> (fromIntegral . length)
于 2012-08-21T20:10:26.293 に答える
14

はい、あなたのtacit関数はモナドliftM2にあります(->) r( liftM2is inControl.Monadで、Monad の関数インスタンスは in ですControl.Monad.Instances)。

次のように呼び出されるプログラムを使用してこれを見つけましたpointfree(経由でインストールできます):cabal install pointfree

$ pointfree '\xs -> sum xs / (fromIntegral $ length xs)'

(Unix 端末で)

于 2012-08-21T18:57:21.433 に答える