2016-09-12 10 views
0

Haskellはペアの一つの要素に関数を適用firstsecondと呼ばれる非常に便利な機能を持っていますScalaの最初のハスケルの同等と第二

first fn (a,b) = (fn a, b) 
second fn (a,b) = (a, fn b) 

は標準のScalaライブラリで定義され、このような機能はありますか?

編集:私はそれがそれらを定義するのは簡単です知っているが、可能な場合、それは標準名で標準関数を使用するクリーナーです...

def first[A, B, X](fn: A => X)(pair: (A, B)): (X, B) = (fn(pair._1), pair._2) 
def second[A, B, X](fn: B => X)(pair: (A, B)): (A, X) = (pair._1, fn(pair._2)) 
+2

https://github.com/scalaz/scalaz/blob/series/7.3。 –

+0

@VictorMorozあなたがそれを答えに変えるなら、私はそれを受け入れるでしょう... – Mohan

+0

それは質問として "標準ライブラリ"ではありませんポーズされた。 –

答えて

1

Haskellの矢印は、(firstsecondはそれらの間である)Scalazで実装されています

Scalaz source

Some examples

それは技術的には安定して標準ライブラリではありませんし、よく維持されるように思えますが。

UPDATE

構文は(多分別の方法がありますか?)しかし少し面倒です:

import scalaz._ 
import Scalaz._ 

val f = (x: Int) => x + 1 
val g = f.second[String] 
g("1", 2) //> ("1", 3) 

// or with type inference 

f second ("1", 2) //> ("1", 3) 
4

は、このような機能は標準のScalaライブラリで定義されていますか?

いいえ。これはScalaで頻繁に現れるものではなく、標準ライブラリにあることを保証するものではありません。爆発的な量のコード(またはマクロ)がなければ、任意のアリティのタプルに一般化することも非常に困難です。

+1

ハスケルはそれを一般化していない。矢印(それはHaskellで呼び出される方法です)は非常に便利で、 'first'と' second'だけでなく、他にもあります。私が理解するようにScalaの方法ではなく、Scalazで実装されています。 –

+0

@VictorMoroz、Haskellの 'Arrow'クラスは、悲しいことに、広く壊れていると考えられています。 'arr'はあまりにも強力で、多くの便利なケースでそれを避ける操作はありません。プラス面では、「第1」と「第2」は概念的に単純な「バイフナクター」クラスの方法でもあります。 – dfeuer

関連する問題