Я пытаюсь решить дробную задачу о рюкзаке с входом,не мог бы соответствовать ожидаемому типу `(t1, t2, t0)» с фактическим типом `[a0]`
[("label 1", value, weight), ("label 2", value, weight), ...]
и выход ,
[("label 1", value, solution_weight), ("label 2", value, solution_weight), ...]
, но я получаю ошибку в computeKnapsack
:
"Couldn't match expected type `(t1, t2, t0)' with actual type `[a0]`"
Я не могу понять, что может быть проблема. Я пытаюсь создать список 3-х кортежей. Как я могу заставить его перестать ожидать одного кортежа с 3 входами?
fst3 (a,b,c) = a
snd3 (a,b,c) = b
trd3 (a,b,c) = c
fst4 (a,b,c,d) = a
snd4 (a,b,c,d) = b
trd4 (a,b,c,d) = c
qud4 (a,b,c,d) = d
sortFrac (a1, b1, c1, d1) (a2, b2, c2, d2)
| d1 > d2 = GT
| d1 <= d2 = LT
fracKnap (x:xs) =
fractionalKnapsack (x:xs) []
fractionalKnapsack (x:xs) fracList =
if length (x:xs) <= 1
then computeKnapsack (sortBy sortFrac (((fst3 x),(snd3 x),(trd3 x),(snd3 x)/(trd3 x)):fracList)) 100
else fractionalKnapsack xs (((fst3 x),(snd3 x),(trd3 x),(snd3 x)/(trd3 x)):fracList)
computeKnapsack (x:xs) weightLeft =
if length (x:xs) <= 1
then (fst4 x, snd4 x, ((floor (weightLeft/(qud4 x)))*(qud4 x)))
else (fst4 x, snd4 x, ((floor (weightLeft/(qud4 x)))*(qud4 x))):(computeKnapsack xs (weightLeft-(floor (weightLeft/(qud4 x))*(qud4 x))))
Просьба _do_ переписать его без этих уродливых 'fst'' snd' 'trd'' qud' функций, это действительно затрудняет понимание того, что происходит. Для каждой записи кортежа должен быть какой-то смысл, описывать его как тип записи ('data KnapsackItem = KnapsackItem {propA :: Foo, propB :: Bar, propC :: Quu}') – leftaroundabout
Очень сложно сказать что 4-кортеж должен представлять, что делает его действительно трудным следовать вашему коду. –