5

次のような非常にハッキーなことをせずに、リストの最初の要素のみを変換する方法はありますか?

val head = l1.head
val tail = l1.tail
val l2   = change(head) :: tail

updated()うまくいくように見えますが、あまり改善されていません:

val head = l1.head
val l2   = l.update(0, change(head))

私は次のようなものが好きです:

val l2   = l1.updateHead(change(_))

そのようなものはありますか?

4

5 に答える 5

16

パターンマッチングを試してみることができます

val l2 = l1 match{
    case Nil   => Nil
    case x::xs => change(x)::xs
}

そうすれば、head実際に要素を返すかどうかを心配する必要はありません

于 2012-05-14T17:37:46.913 に答える
9

あらゆる機会に変数を導入することで、人生をより困難にしています。それをしないでください!

一時変数を導入しない場合、リストしたオプションはどちらもかなりクリーンです。

val l2 = change(l.head) :: l.tail
val l2 = l.update(0, change(l.head))

空のリストではどちらも完全に安全ではありませんが、

val l2 = l.take(1).map(change) ::: l.drop(1)

は。

ただし、独自の方法でリストを自由に充実させることもできます。

class ReheadableList[A](xs: List[A]) {
  def rehead[B >: A](f: A => B) = xs.take(1).map(f) ::: xs.drop(1)
}
implicit def lists_can_be_reheaded[A](xs: List[A]) = new ReheadableList(xs)

(編集 - 空のリストによるエラーを回避するために変更)。今、あなたはただすることができます

val l2 = l.rehead(change)
于 2012-05-14T17:44:35.647 に答える
5

部分レンズ (このペーパーで説明) を使用すると、次のように記述できます。

listHeadLens.set(list, newValue)

は次のようにlistHeadLens定義されます。

def listHeadLens[A] = new PartialLens[List[A], A] {
  def apply: List[A] => Option[CoState[A, List[A]]] = {
    case Nil => None
    case x :: xs => Some(CoState(x, _ :: xs))
  }
}

部分的なレンズは Scalaz 7 に移行すると思いますが、確かではありません。

于 2012-05-14T17:55:14.777 に答える
3

これを行うには、おそらく多くの方法があります。以下は、1 つのバージョンを示す Scala REPL セッションです。

scala> val change = (x: Int) => x*2
change: Int => Int = <function1>

scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> l.headOption.map( x => change(x) :: l.drop(1) ).getOrElse(Nil)
res3: List[Int] = List(2, 2, 3)
于 2012-05-14T17:53:03.663 に答える
1

このようにできます。

val list = List("1","2","3")
def change(str : String ) = Some("x")

val nlist = (list.headOption.flatMap(change(_)).toList ::: list.tail)

コンソールで。

scala> val list = List("1","2","3")
list: List[java.lang.String] = List(1, 2, 3)

scala> def change(str : String ) = Some("x")
change: (str: String)Some[java.lang.String]

scala> val nlist = (list.headOption.flatMap(change(_)).toList ::: list.tail)          
nlist: List[java.lang.String] = List(x, 2, 3)
于 2012-05-14T18:15:37.003 に答える