Пример функционального программирования на scala

Я изучаю скалу. Это очень многообещающе, спасибо Одерскому и всем другим авторам за их прекрасную работу.

Я взял задачу Эйлера ( 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.

7
задан Ratman 10 August 2011 в 16:53
поделиться