Я играю с некоторыми базовыми упражнениями по программированию, чтобы лучше изучить Scala, но я застрял пытаясь понять, почему мой код не будет вводить проверку.Я хочу, чтобы моя функция возвращала Stream [T], но я не могу понять, как это сделать. Check
Точка крепления - это функция possibilities
. Я хочу функцию, которая возвращает поток, содержащий все возможные расположения чисел и математических операторов, с учетом списка чисел.
Я смущен, потому что изменение типа возвращаемого значения функции для чтения Stream[Object]
проверяет корректность и возвращает результаты, которые кажутся потоками уравнений. Однако версия, приведенная ниже , не содержит тип проверки с типом возврата possibilites
, установленным на Stream[Equation]
.
В качестве примечания стороны, я понимаю, что добавление opsMix с карточками не помещает Operation
s в правильном порядке, но сначала я хотел бы решить эту часть проблемы. Думаю, я воспользуюсь flatMap
или zipAll
с flatten
, чтобы выполнить эту часть.
Также - это не домашнее задание!
abstract class Operation
case class Add() extends Operation
case class Subtract() extends Operation
case class Multiply() extends Operation
case class Divide() extends Operation
case class Num(val valu: Float) extends Operation
type Equation = List[Operation]
def calc(equa: Equation): Float =
equa match {
case Num(x) :: List() => x
case Num(x) :: y :: Num(z) :: xs => y match {
case Add() => calc(Num(x + z)::xs)
case Subtract() => calc(Num(x - z)::xs)
case Multiply() => calc(Num(x * z)::xs)
case Divide() => calc(Num(x/z)::xs)
}
case _ => 0
}
// from http://stackoverflow.com/questions/1070859/listing-combinations-with-repetitions-in-scala
def mycomb[T](n: Int, l: List[T]): List[List[T]] =
n match {
case 0 => List(List())
case _ => for(el <- l;
sl <- mycomb(n-1, l dropWhile { _ != el }))
yield el :: sl
}
def comb[T](n: Int, l: List[T]): List[List[T]] = mycomb(n, l.removeDuplicates)
val ops = List(Add, Subtract, Multiply, Divide)
def possibilities(cards: List[Num]) : Stream[Equation] =
{ for {
hand <- cards.permutations
opMix <- comb(cards.length-1, ops)
} yield hand ++ opMix
}.toStream
// test value:
val ppp = possibilities(List(Num(20), Num(3), Num(7), Num(100)))
Спасибо, хороший ответ. Ваши предложения полностью верны. Теперь, пытаясь использовать zipAll и сгладить, как я планировал, я столкнулся с другой ошибкой, связанной с типом ... Какова будет ваша первая идея поместить элементы 'card' и 'opMix' в порядке чередования? –
@DustMason Я добавил некоторые идеи в ответ. –
Очень полезно, спасибо! Ваши окончательные предложения больше похожи на «scala way» для меня, поскольку он решает проблему с четко определенными типизированными классами. –