8

非常に小さな数式インタープリターの場合、誰かがコードゴルフをするように頼んだので、次のようなことをしたかったのです。

  val ops = Map("plus" -> + , "minus"-> -, "times"-> *, "div" -> / )

キーワードとそれらが説明する機能との間の迅速な変換を可能にします。この構文が解析されなかっただけでなく、私が試した他の簡略構文も ( _ + _, _:Int.+_) 解析されませんでした。関数の省略形としてこれを行う方法はありますか、それともラムダを完全に書き出す運命にあり、ゴルフのスコアが台無しになります。

編集:問題の問題は整数のみでした。そうしないと、オーバーロードするとこれが非常に難しくなることを理解しています。

4

1 に答える 1

5

追加の関数を定義することによってスコアがどのように影響を受けるかわかりません。次のようなものを使用して、演算子を持ち上げることができます。

def lift(f:(Int,Int)=>Int) = f
val ops = Map("plus" -> lift(_+_), "minus" -> lift(_-_), "times"-> lift(_*_), "div" -> lift(_/_))

そして、いくつかの文字を削りたい場合:

def  ↑(f:(Int,Int)=>Int) = f
val ops = Map("plus" -> ↑(_+_), "minus" -> ↑(_-_), "times"-> ↑(_*_), "div" -> ↑(_/_))

そして、om-nom-nom コメントのように、この明示的なリフティングは、型シグネチャを提供してリフティングを強制することによって、コンパイラーによっても行うことができます。

val ops: Map[String, (Int,Int) => Int] = Map("plus" -> (_+_), "minus" -> (_-_), "times"->(_*_), "div" -> (_/_)) 
于 2013-09-27T15:58:40.113 に答える