F #: Как передать два списка в формулу и вернуть мои результаты? - PullRequest
0 голосов
/ 30 сентября 2018

Итак, у меня есть эта функция, где я беру два поплавковых списка и использую их соответствующие элементы индекса для вычисления этой простой формулы: (x-y)^2 / x для каждого индекса (0,1,2,3 ...)

Вот что у меня есть:

let myCalc (list1: float list) (list2: float list) : float list  = 
    List.map2 (fun x y -> (x-y)^2 / x) list1 list2

Я получаю эту ошибку: This expression was expected to have type 'float' but here has type 'string'

Почему мой подход, перечисленный выше, не будет работать, но этот пример работает:

let list1 = [1; 2; 3]
let list2 = [4; 5; 6]
let sumList = List.map2 (fun x y -> x + y) list1 list2
printfn "%A" sumList

Может кто-нибудь объяснить, как я могу понять разницу между написанным мною кодом и приведенным выше примером кода?И да, я уже пытался установить List.map2 в переменную и затем распечатать его, но это тоже не сработало.Я думаю, что это как-то связано с тем, как я делаю свои вычисления, я просто не знаю, что не так.

Кроме того, я хочу, чтобы мой выходной результат был сохранен в списке соответствующих индексов x и y.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 30 сентября 2018

Причина этой ошибки относительно проста, вы используете неправильный оператор питания (^).В F # и вообще в семействе языков ML этот оператор является оператором строки конкатенации.Вот почему вы получаете эту ошибку, поскольку компилятор ожидает найти два параметра типа string в rvalue и lvalue для оператора ^.

Вы должны использовать оператор **:

let myCalc (list1: float list) (list2: float list) : float list =
    List.map2 (fun x y -> (x - y) ** 2. / x) list1 list2

2 - это литерал типа int, мы должны указать, что мы хотим использовать литеральное значение типа float для выражения, поэтому это дает нам следующее: 2.

...