2016-02-14 3 views
3

Я пишу код в F #, и мне нужно умножить и добавить каждый элемент в список кортежей (c,d) по кортежу (a,b).Умножение списка кортежей на кортеж в F #

Чтобы уточнить,

  • У меня есть некоторый набор (a,b)
  • и некоторый список кортежей [(c,d),(e,f),(g,h)...]
  • , и я пытаюсь получить [(a*c,b*d),(a*e,b*f),(a*g,b*h)...]
  • , и я пытаюсь получить (с отдельная функция) [(a+c,b+d),...]

Я попытался использовать List.map, чтобы умножить каждый элемент в списке на кортеж, но я получаю сообщение об ошибке, которое * является недопустимым оператором для типа tuple.

Это, как я в конечном итоге реализации функции умножения рекурсивно поиска по шаблону:

let rec mtp(t:term,p:poly):poly = 
    match (t, p) with 
     | (a,b),[] -> [] 
     | (a, b),(c,d)::ps -> (a*c,b*d)::mtp(t,ps) 

Где термин кортеж поплавок * междунар и поли является список терминов

+7

По крайней мере, показать, что вы пробовали и где вы застряли –

+2

В SO ожидается, что вы показываете, что вы пытались так что 1. Мы не делаем домашнее задание для вас. 2. Чтобы мы могли увидеть, есть ли у вас простая ошибка, можно легко исправить. 3. Чтобы другие, у кого, вероятно, была такая же идея, как вы узнаете, имеют ли они ту же идею, что и вы. Поскольку вы не пытались, большинство из нас не даст вам ответа. Также вам нужно искать ответ в SO, поскольку подобный был указан только в предыдущие дни, например. [F # добавление многочленов рекурсивно] (http://stackoverflow.com/q/35376734/1243762) –

+1

@GuyCoder благодарю вас, у меня действительно есть проблемы с чего начать! Ссылка, которую вы мне предоставили, очень помогла! Спасибо – Matthew

ответ

6

Ok List.map является хорошая идея - вам нужно только убедиться, что вы что-то даете (допустим, лямбда), чтобы сообщить F #, как работать с двумя кортежами.

Чтобы сделать его немного более общем, вы могли бы сделать что-то вроде этого:

let withTuple (a,b) op tpls = 
    List.map (fun (a',b') -> (op a a', op b b')) tpls 

И работать с ним, как вы ожидали

> withTuple (1,1) (+) [(2,3);(4,5)];; 
val it : (int * int) list = [(3, 4); (5, 6)] 
> withTuple (2,1) (*) [(2,3);(4,5)];; 
val it : (int * int) list = [(4, 3); (8, 5)] 

, чтобы понять это немного лучше, вы должны :

  • попытаться выяснить подпись (Хорошо использовать F #/F # Interactive, если вам нравится)
  • возможно попытаться написать функцию, где части кортежа могут иметь различные типы (подсказка: вам нужно больше, чем один op функцию)
  • зачем вам более одной функции для последней? (Почему будет withTuple (2.0,1) (*) [(2.1,3);(4.2,5)] не работать - это не (+) должен работать для всех чисел?)
+0

Спасибо, это действительно помогает! – Matthew

+0

просто убедитесь, что вы это поняли! - Например, я не * добавлял * последний параметр в 'List.map' - вы знаете, почему это работает? – Carsten

+0

Я играю с кодом в интерактивном прямо сейчас @Carsten – Matthew

Смежные вопросы