2016-11-14 8 views
1

私はxyときzで値xを交換し、そうでない場合は何もできない機能と思って、それは次のようになります。"replace-if"を実行する最良の方法は何ですか?

\x -> if x == y then z else x 

それだけで私のプログラムで一度使用されますと、それはの真ん中にあります関数チェーンなので、名前付き関数として定義したくないので、ラムダ式が不必要に冗長に見えると思います。代わりに、私は他の機能からそれを構成しようとしています。しかし、これまでのところ私はこの不可解な(とcring-y)は1が出ている:

(ap . flip . bool id $ const z) (== y) 

は、このような単純な機能のためのより良いポイントフリーフォームはありますか?

+1

私は、最初のポイントのあるバージョンよりも本当に良いものはないと思います。 – chi

+0

@chi:そうかもしれない。でも、私は本当に満足していません。驚くばかり 。 (\ x - > x == yならばz else x)。関数 。チェーン$ val'。 :P – trVoldemort

+2

'' '' '' '節で定義するだけではどうですか? –

答えて

5

わかりやすいものはありません。

execState (gets (==y) >>= flip when (put z)) 

fromMaybe <*> flip lookup [(y, z)] 
+5

私は 'bool z <*>(/ = y)'がこれらの回答の中で最も悪い選択だと感じています。 – duplode

4

私はこれをあまり認めませんが、Hayoo searchdata-easyパッケージの(?|)オペレーターに私を導きました。このパッケージはそのような機能でいっぱいです( "non-idiomatic haskell"に関する免責条項がたくさんあります)。

fromBoolC z (/= y) 
+0

'Data.Easy'はそのモジュールの名前の興味深い選択です... – duplode

+0

' Data.Easy'のドキュメントからストレート: "注:これはおそらく良い習慣とは考えられません。そうではなく、そのほとんどが常により明確になりました。あなたは警告されています。実際に、わかりやすい基本的な読取り可能な代替手段が存在する場合、私は珍しい機能を調べなければならないのはなぜですか? – chi

4

lensから:あなたはさておき

\x -> if x == y then z else x -- the cluttered Haskell form 

\x -> x ?| (/= y) $ z   -- the "Pythonic" form 

(?| (/= y)) z     -- Haskell-sections-galore of the "Pythonic" form 

ジョークを持つことができるように見え、はるかに合理的なfromBoolCあなたはおそらく好きになることもあります

import Control.Lens 

f = (^. non z) . (non y #) -- for some z and y 

if then elseバージョンがされます間違いなく良い。

1

あなたが検索でcase文を交換するPythonのトリックを使用することができます。私は得ることができ、最短は

bool z <*> (/= y) 

さらに愚かな方法です。

pointfree.ioによるとそれは必ずしも明らかではないのですが、同時にそれは、引数から機能部品を分離

flip (join findWithDefault) (singleton y z) 

に減少させることができる

import Data.Map 

\x -> findWithDefault x x (singleton y z) 

flip (join findWithDefault)はあなたが望むものを行い、singleton y zは例外を指定するDSLのような方法です。 idExcept = flip (join findWithDefault)exception = singletonをあなたのコードの前に貼り付けると、あなたのチェーンはほとんど読めるようになります。

my . awesome . (idExcept (exception y z)) . function . chain $ val 
関連する問題