Полиномиальное вычисление в haskell

Я пытался создать функцию, которая оценивает многочлены от целых чисел.

Теперь у меня есть

> type Poly = [Int]

> polyEval :: [(Float,Int)] -> Float -> [(Float,Int)]
> polyEval [] _ = []
> polyEval ((c,g):xs) n = map (\ (c,g) -> (c*n,g)) xs

Если я введу polyEval [] 3, на выходе будет []. Но когда я хочу вычислить что-то вроде polyEval [3] 2, Хагс говорит

ERROR - Cannot infer instance
*** Instance   : Num (Float,Int)
*** Expression : polyEval [3] 2

Почему?


person haskellnoob    schedule 20.11.2013    source источник
comment
Вы можете подробно описать свой алгоритм?   -  person Ilya Rezvov    schedule 20.11.2013
comment
Что вы пытаетесь сделать с polyEval? Название (и ваш вопрос) предполагает, что вы хотите оценить полином; почему он возвращает список?   -  person comingstorm    schedule 21.11.2013


Ответы (1)


Вы обещаете компилятору поместить список кортежей (Float, Int) в polyEval функцию, но вы помещаете только 3. Haskell попробует преобразовать 3 в (Float, Int), но это невозможно. Если вы назовете polyEval как polyEval [(1.0, 3)] 2, он будет компилироваться нормально.

Другой момент - вы производите сопоставление с образцом в начале списка polyEval ((c,g):xs) и отбрасываете результаты в следующих вычислениях.

person Ilya Rezvov    schedule 20.11.2013
comment
Спасибо! Теперь мой вывод всегда []. Где виноват - person haskellnoob; 20.11.2013
comment
@haskellnoob вы всегда отбрасываете первый элемент списка, а затем сопоставляете остальные. Если у вас есть список с одним элементом - вы отображаете пустой список, и результат также будет пустым списком. - person Ilya Rezvov; 20.11.2013
comment
Обратите внимание, что мы избегаем говорить о преобразовании числовых литералов в .... Haskell никогда не выполняет неявных преобразований. ИМО, лучший способ описать это - Haskell пытается интерпретировать 3 как значение (Float, Int). - person leftaroundabout; 21.11.2013
comment
@leftaroundabout я согласен с вами. я буду использовать это описание - person Ilya Rezvov; 21.11.2013