2016-08-09 8 views
3

Advent of Codeのコーディングの課題に取り組んでいます。私は1日目です。私は何も含まれていないファイルから読みました((()(())((私は1と各 'に'を '-1'に変えることを考えています)しかし、私はマップ findFloorソース上。私は型の不一致を取得していたとき、私は問題を抱えている。すべてが私に右見て、それはそれは働いていないので、奇妙な部分です。リスト内の要素にパターンマッチングを使用するにはどうすればよいですか?

import scala.io._ 

object Advent1 extends App { 

// Read from file 
val source = Source.fromFile("floor1-Input.txt").toList 

// Replace each '(' with 1 and each ')' with -1, return List[Int] 
def findFloor(input: List[Char]):Int = input match { 

     case _ if input.contains('(') => 1 
     case _ if input.contains(')') => -1 

} 

val floor = source.map(findFloor) 

} 

エラー出力

error: type mismatch;

found : List[Char] => Int

required: Char => ?

val floor = source.map(findFloor) ^ one error found

私はここで間違ってやっている?/私は私が行方不明?

答えて

2

Scala map works全体ではなくover an elementsです。これを試してみてください:

+1

安全に '(_ match'、' .map {case ...} 'も同様に動作しますが、部分無名関数を定義しています) –

+0

ありがとう!しかし、私はsource.map(findFloor)アプローチ私が言うことができる限り、私は機能のリストを提供している私たちは、チャーのリストを受け取ることを期待しているので、私は問題が何であるか分かりません。 – Native

+0

@VictorMorozありがとう!私は答えを編集しました – vsminkov

0

逐次的に計算したい場合は、foldLeftを使って直接計算することもできます。

val computation = source.foldLeft(0)((a, b) => { 
    b match { 
     case '(' => a + 1 
     case ')' => a - 1 
    } 
}) 

単純にすべての値を加算し、計算された値を返します。それは(それが加算され、 ')'のために減算されます。

最初の引数は開始値、aは前のステップの値、bは実際の要素、したがってcharです。

0

パターン一致がすべての文字に対して定義されていないため、エラーが発生している可能性があります。あなたは他のすべてのものにマッチしていません。たとえば、case _ => 0です。 これはPartialFunctionを受け入れ、一致しない要素をすべて無視するため、他のオプションは 'collect'を使用することです。

提案されている「折りたたみ」ソリューションは、私が考えるより良いアプローチです。

+0

ありがとう、私もそれをチェックします。また、私が読んでいたファイルは文字 '('と ')だけであるため、私は2つのケースしか必要としませんでした。明らかに、物事が違うならば、私は対処する必要がさらに増えます。 – Native

+0

しかし、コンパイラはファイルに2つの異なる文字があることを知らない。もう一度それを見ると、List内の項目の代わりにListと一致しています。要素を照合するには、関数を使用して 'map'を使用するか、部分関数を使用して 'collect'を使用します。 –

関連する問題