問題タブ [pointfree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Haskellで引数を「再利用」するためのトリック?
ときどき、ポイントフリー スタイルを記述したり、ラムダを回避したりするために、「最後の引数を 2 回使用してください」と表現したい問題に出くわします。例えば
次のように書くことができます
または、この少し複雑な関数を検討してください (この質問から取得):
次のような関数があれば、このコードを無意味に書くことができます。
しかし、Hoogle で doubleArgs や dup のようなものを見つけることができないので、ここでトリックやイディオムを見逃す可能性があると思います。
scala - より大きな行列から一意の行列を見つける
私は関数型プログラミングにかなり慣れていないので、いくつかの練習問題を行っています。一意の自然の行列、たとえば5x5が与えられた場合に、関数を記述したいと思います。たとえば、3x3のように、より小さなサイズの一意の行列のコレクションを返します。ここで、行列はそのままである必要があります。つまり、元の値に隣接する値から作成されます。
単純。3つのグループで1つずつ横にスライドしてから下にスライドするだけで、次のようなものが得られます。
または、Scalaでは
などなど...
それで、私はScala(命令型から機能型に進化することができるので私の選択した言語)に挑戦し、ここ数年はJavaで過ごしました。
これで、作業できるデータ構造ができましたが、機能的な方法がわかりません。確かに、私は各ピースをトラバースしsliced
、作成し、var matrix = new ListBuffer[Seq[Int]]()
それらのバッグを作成することができます。これで完了です。
Scalaを使用して、機能的で理想的にはポイントフリーのアプローチを見つけたいのですが、困惑しています。3などでzipする方法が必要です...ScalaDocsを検索しましたが、理解できないようです。
haskell - 無意味なスタイルをいつ使うべきですか?
私を含む多くのhaskellプログラマーは、特に複雑なパーサーを書くときは、無意味なスタイルが好きです。これらにより、コードが読みやすくなり、冗長性が低くなります。しかし、場合によっては、それが逆になることもあります(たとえば、のインスタンスMonad
や友人を悪用しているときなど(->) a
)。
無意味なスタイルが役立つと思うときとそうでないときの基本的なガイドラインを教えてください。たとえば、代わりに部分的なコンポジションを使用する必要がある場合は、常にラムダを使用します(のようなものflip ((.) . take) . drop
)。
haskell - Monad の (->) インスタンスの使い方と (->) についての混乱
(->)
さまざまな質問で、たとえばポイントフリー スタイルを実現するためにモナドのインスタンスを使用することに関するヒントをコメントで見つけました。
私の場合、これは少し抽象的すぎます。わかりました、私は Arrow インスタンスがオン(->)
になっているのを見てきましたが、それ(->)
はインスタンス表記では使用できますが、型宣言では使用できないようです (それは別の質問のためだけのものです)。
(->)
モナドのインスタンスとして使用する例はありますか? それとも良いリンクですか?
この質問がすでにここで議論されている場合は申し訳ありませんが、「(->)
モナドインスタンス」を検索すると、想像できるほど多くのヒットが得られます...Haskellに関するほとんどすべての質問は(->)
「モナド」に関係しているためです。
f# - 関数型プログラミングにおける「ポイントフリー」スタイルの長所と短所は何ですか?
一部の言語(Haskell?)では、ポイントフリースタイルを実現すること、または関数の引数を名前で明示的に参照しないことを目指していることを私は知っています。これは私が習得するのは非常に難しい概念ですが、そのスタイルの長所(またはおそらく短所)が何であるかを理解するのに役立つかもしれません。誰か説明できますか?
haskell - ブール関数に対して「and」と「or」を実行する Haskell で
次の2つの関数を書きました:
これらは、次のような 2 つのブール関数の値を結合するために使用できます。
この 2 つの機能を見て、非常に便利であることがわかりました。そのため、標準ライブラリに含まれているか、既存の関数を使用してこれを行うためのクリーンな方法がある可能性が高いと思われます。
これを行う「正しい」方法は何でしたか?
haskell - タイプ(c→d)→(a→b→c)→(a→b→d)のHaskell関数合成演算子
通常の関数合成は次のタイプです
これは次のようなタイプに一般化する必要があると思います。
具体的な例:二乗の差の計算。書くことはできますがdiffsq a b = (a - b) ^ 2
、を作曲して、のようなものを書くことができるはずだと思います。(-)
(^2)
diffsq = (^2) . (-)
もちろんできません。私にできることの1つは、に2つの引数の代わりにタプルを使用して、(-)
それをで変換することuncurry
ですが、これは同じではありません。
私がやりたいことをすることは可能ですか?そうでない場合、それが可能であると私に思わせる私は何を誤解していますか?
注:これは事実上ここですでに尋ねられていますが、答え(私は存在しているに違いないと思います)は与えられていません。
haskell - Haskellでポイントフリーのパターンマッチングが可能?
与えられた:
とをadd'em
名乗らなくても書けますか?何かのようなもの:a
b
haskell - ポイントフリーコードはより効率的ですか、それとも単純ですか?
私は次のコードを書きました。このコードは、一連のポイントを取得し、gloss ライブラリを使用して画面に描画します。
それは正常に動作しますが、繰り返されるパターンがあることに気付きました。関数呼び出しのチェーンであり、それぞれの結果が次の最後の引数に供給されます。そこで、中間変数を削除してリファクタリングし、順序を逆にして、関数合成 (".") を使用して関数を次のように連鎖させました。
幸いなことに、これも問題なく機能します。しかし、読みやすさに負担をかけているのか、それともポイントフリースタイルのコードの読み書きに慣れていないだけなのか疑問に思っています。また、このコードについてどのように推論すればよいですか? 2 番目のバージョンはより効率的ですか、それとも簡潔ですか? より明確にするためにスタイル的にできることはありますか?
haskell - zipWithNで演算子を使用する
たとえば、次のように書くことができます。
3リストをタプルする場合は、次のように記述できます。zipWith3(,,)[1,2,3] [4,5,6] [7,8,9]
使用することもできます zipWith4 (,,,) zipWith5(,,,,)
。
今、私は同じことをしたいのですが、代わりにコンマ演算子を追加します。のようにラムダを使用せずに、同じ簡潔な方法でそれを定義する方法はありますか?
回答ありがとうございます。