26

重複の可能性:
カリー化減算

私はチュートリアルからではない最初の haskell プロジェクトを開始しましたが、もちろん、最も単純なことに出くわしました。

次のコードがあります。

moveUp y = modifyMVar_ y $ return . (+1)
moveDn y = modifyMVar_ y $ return . (-1)

コードがコンパイルされない理由を理解するのに少し時間がかかりました。負の値として認識される (-1) を使用していました。マイナスを括弧で囲んでも、先頭に付けて最初のパラメーターを 1 にするため、役に立ちません。

要するに、これのポイント無料版とは何ですか?

dec :: Num a => a -> a
dec x = x - 1
4

3 に答える 3

30

便利な名前のsubtractfunctionが必要だと思います。これは、まさにあなたが発見した理由で存在します。

subtract :: Num a => a -> a -> a

と同じflip (-)

-は Haskell 文法で特別に扱われるため(- e)、セクションではなく、接頭辞否定の適用です。ただし、(subtract exp)不許可区間に相当します。

のような関数を使用せずにポイントフリーで書きたい場合は、ドキュメントに記載されているようsubtractに を使用できます。しかし、それは...ちょっと醜いです。flip (-)Prelude

于 2012-10-11T02:21:57.980 に答える
6

上記subtractが冗長すぎる場合は、(+ (-1))またはのようなものを試すことができます(-1 +)

于 2012-10-11T02:24:27.180 に答える
4

機能を使用できますsubtract(標準プレリュードにあります)。

moveDn y = modifyMVar_ y $ return . (subtract 1)

フリップを使用して、受け取るパラメーターを並べ替えることもでき-ます。

moveDn y = modifyMVar_ y $ return . (flip (-) 1)
于 2012-10-11T02:22:20.547 に答える