2016-09-12 2 views
0

Haskell имеет очень удобные функции, называемые first и second, которые применяются функции к одному элементу из пары:Scala эквивалент Haskell первого и второго

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

ли такие функции, определенные в стандартных библиотеках Scala?

Edit: Я знаю, что это легко определить их, но там, где это возможно, это уборщик, чтобы использовать стандартные функции со стандартными именами ...

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. x/core/src/main/scala/scalaz/Arrow.scala, а не стандартная библиотека, но –

+0

@VictorMoroz, если вы включите это в ответ, я приму это ... – Mohan

+0

Хорошо, но это не «стандартная библиотека», как вопрос был поставлен. –

ответ

1

Стрелки на Haskell (first и second среди них) реализуются в 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?

Nope. Это не так часто возникает в Scala, что он гарантирует, что находится в стандартной библиотеке. Также очень сложно обобщить кортежи любой арности без взрывного количества кода (или макроса).

+1

Haskell не обобщает его ни на какие артерии. Стрелки (так они называются в Haskell) могут быть весьма полезными, а не только «first» и «second», есть и другие. Как я понимаю, это просто не Scala, но они реализованы в Scalaz. –

+0

@ VictorMoroz, класс «Стрела» Хаскелла, к сожалению, широко считается сломанным. 'arr' слишком силен, и операции, которые могут избежать этого во многих полезных случаях, отсутствуют. С положительной стороны, 'first' и' second' также являются методами концептуально более простого класса Bifunctor. – dfeuer

Смежные вопросы