2013-04-02 2 views
0

Мне нужно найти как минимум список кортежей, но я хочу только вернуть минимум snd элемент кортежей, а не весь кортеж. К сожалению, у меня есть следующая ошибка в следующем коде, и я не знаю, почему. Л аргументом является список кортежей (float * float)Как найти минимальный список кортежей

let rec minRight l = match l with 
    | [] -> raise (Arg.Bad "minRight: empty list") 
    | [x]-> x 
    | (_,y)::xs -> min y (minRight xs) 

Ошибка:

| (_,y)::xs -> min y (minRight xs) 
Error: This expression has type 'a but an expression was expected of type 
     'b * 'a 

Спасибо заранее.

ответ

2

Вот одна проблема, в дополнение к тем, что упомянутые в предыдущих ответах: линия

| [x]-> x 

возвращает кортеж, в то время как вы сказали, что хотите «вернуть минимум SND элемента [с] из кортежи».

+0

Хорошо, я думаю, что это проблема, я удаляю эту строку и, наконец, компилирует: D – user2236919

+0

Не удаляйте эту line, функция не будет обрабатывать список из списков длины один. В первом случае это исключало бы исключение. Вместо этого перепишите его '| [_, y] -> y'. (PS: не забывайте поднимать все ответы, которые были полезны). – jrouquie

+0

Спасибо! Решение: let rec minRight l = совпадение l с | [] -> raise (Arg.Bad "minRight: empty list") | [(x, y)] -> y | (_, y) :: xs -> min y (minRight xs) – user2236919

0

Я думаю, может быть, ваша проблема в том, что вы назвали свою функцию min, но вы также хотите использовать стандартную функцию OCaml min. Это возможно?

OCaml не имеет перегрузки (в качестве компенсации он имеет параметрический полиморфизм). Поэтому вам нужно использовать разные имена для вещей.

+0

Прошу прощения, я изменил исходное имя на «мин», чтобы упростить, но я забыл эту проблему. Но исходное имя функции не является минимальным, так что это не проблема =/ – user2236919

+0

Спасибо, проблема решена , Из-за моей репутации я не могу дать вам голос. – user2236919

+0

(Мы все можем превзойти нашу репутацию. Я думаю, что другие ребята помогли больше, чем я.) –

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