2

私は Scala を初めて使用し、メソッド シグネチャに苦労することがあります。このコードを見てみましょう。特に、パラメーターに名前を付けて、さらに操作を行うことに興味があります。

def divide(xs: List[Int]): List[Int] = {
      val mid = xs.length/2
      (xs take mid, xs drop mid)
}

ここでは、「xs」という名前の入力リストを定義しました。この規則は、多くの Web ページで見てきました。しかし、大学では、別のメソッド シグネチャ定義メソッド (名前がありません。申し訳ありません) がありました。このメソッドでは、入力パラメーターに名前を付けませんでしたが、パターン マッチングが行われます。

   def mylength: List[Any] => Int = {
     case Nil   => 0
     case x::xs => mylength(xs)+1
   }

この場合、入力パラメータが 1 つしかないため、入力パラメータを特定するのは非常に簡単です。上記のコーディング スタイルで 2 つ以上の入力パラメーターを使用して、以下のコードと同じスタイルを使用するにはどうすればよいですか?

   def myConcat(xs: List[Any], ys: List[Any]) = {
              xs ++ ys
   }

私の英語でごめんなさい。どの用語を検索すればよいのかまったくわからなかったので、Google では何も見つかりませんでした...

編集:インターフェイスに固執する必要があります。私はあなたが私を助けることができる別の例を作ります. myAppend1 と myAppend2 は同じように動作し、新しい要素をリストの前に置きます。

   def myAppend1(xs: List[Any], y: Any): List[Any] = {
        y :: xs
   }

私の問題は、myAppend2 での入力の命名です...

  def myAppend2: List[Any] => Any => List[Any] = {
           /* how can i do this here, when no names y/xs are given?*/
   }
4

2 に答える 2

3

2 つ以上のパラメーターで同じスタイルを使用するには、パラメーターを 2 つのタプルとして扱います。

 def myConcat: (List[Any], List[Any]) => List[Any] = { 
   case (Nil, Nil) => List()
   case (xs,ys) => ... 
 }

例を見てみましょうmyAppend

 def myAppend2: (List[Any], Any) => List[Any] = {
    case (xs, y) => y :: xs 
 }

これは (多かれ少なかれ) 以下と同じ署名を持っています:

def myAppend1(xs: List[Any], y: Any): List[Any] = {
    y :: xs
}

使用法:

scala> myAppend1(List(1,2,3), 4)
res3: List[Any] = List(4, 1, 2, 3)

scala> myAppend2(List(1,2,3), 4)
res4: List[Any] = List(4, 1, 2, 3)

の関数引数が必要な高階関数がある場合(List[Any], Any) = List[Any]、両方が機能し、(ほとんどの実用的な目的で) 同等です。

次のように定義することに注意してください

def myAppend3: List[Any] => Any => List[Any] = {
   xs => y => y::xs
}

カリー化された関数を作成します。これは、scala では (必要なものとは) 異なる署名を持ちます。

 myAppend3(List(1,2,3), 4) // won't compile
 myAppend3(List(1,2,3))(4) // need to do this
于 2013-01-30T16:07:47.713 に答える
1
def myAppend2: List[Any] => Any => List[Any] = { xs => y => 
    y :: xs
}

関数リテラル構文の完全な形式:

def myAppend2: List[Any] => Any => List[Any] = {
    (xs: List[Any]) => {
        (y: Any) => {
            y :: xs
        }
    }
}
于 2013-01-30T17:38:10.857 に答える