Я изучаю скалу. Это очень многообещающе, спасибо Одерскому и всем другим авторам за их прекрасную работу.
Я взял задачу Эйлера ( http://projecteuler.net/ ), чтобы получить более чем минимальный пример. . И я стараюсь идти функциональным путем. Так что это не «пожалуйста, ответь мне немедленно, или мой босс убьет меня», а «пожалуйста, если у тебя есть время, можешь ли ты помочь программисту на императивном языке совершить путешествие в мир функциональности?»
Проблема: Я хочу уроки покера. Рука в покере состоит из числа карт от 0 до 5. Я хотел бы составить список карт для всех, то есть: мой класс Hand будет неизменным, если я хочу добавить карту, тогда Я создаю новый объект Hand. Поэтому мне нужна коллекция Card, которую можно создать как "val", а не как var. Первый шаг: конструкторы, по одному на каждое количество карточек. Но коллекция Card обрабатывается в каждом конструкторе, поэтому я должен использовать ее как var!
Вот код, класс Card - это просто масть и значение, переданное конструктору в виде строки («5S» - это 5 пик) :
class Hand(mycards : List[Card]) {
// this should be val, I guess
private var cards : List[Card] = {
if (mycards.length>5)
throw new IllegalArgumentException(
"Illegal number of cards: " + mycards.length);
sortCards(mycards)
}
// full hand constructor
def this(a : String, b : String, c : String, d : String, e : String) = {
this(Nil)
// assign cards
val cardBuffer = new ListBuffer[Card]()
if ( a!=null ) cardBuffer += new Card(a)
if ( b!=null ) cardBuffer += new Card(b)
if ( c!=null ) cardBuffer += new Card(c)
if ( d!=null ) cardBuffer += new Card(d)
if ( e!=null ) cardBuffer += new Card(e)
cards = sortCards(cardBuffer.toList)
}
// hand with less then 5 cards
def this(a : String, b : String, c : String, d : String) = this(a,b,c,d,null)
def this(a : String, b : String, c : String) = this(a, b, c, null)
def this(a : String, b : String) = this(a, b, null)
def this(a : String) = this(a, null)
def this() = this(Nil)
/* removed */
}
Вы знаете, как сделать это по-настоящему функциональным? Спасибо.
PS: если действительно хотите знать, это проблема 54.