Как я могу избежать предупреждений, когда я применяю функцию к известному списку аргументов в OCaml? - PullRequest
2 голосов
/ 03 декабря 2009

Как преобразовать несколько значений a, b, c и т. Д. В a', b', c' и т. Д., Чтобы x'=f(x)? Значения привязаны к конкретным именам, а их количество известно во время компиляции.

Я пытался применить функцию к списку следующим образом:

let [a';b'] = List.map f [a;b] in ...

Но выдает предупреждение:

Warning P: this pattern-matching is not exhaustive.                                                                                                         
Here is an example of a value that is not matched:                                                                                                          
[]

Есть ли способ избежать этого?

Ответы [ 3 ]

7 голосов
/ 03 декабря 2009

Вы можете написать несколько функций для сопоставления с единообразными кортежами, т.е.

let map4 f (x,y,z,w) = (f x, f y, f z, f w)
let map3 f (x,y,z) = (f x, f y, f z)
let map2 f (x,y) = (f x, f y)

и тогда вы можете просто использовать их при необходимости.

let (x',y') = map2 f (x,y)
4 голосов
/ 03 декабря 2009

К сожалению нет. Вы можете отключить компилятор, написав

match List.map f [a;b] with
  [a';b'] -> ...
| _ -> assert false

но это все.

1 голос
/ 05 апреля 2012

Компилятор пытается помочь вам здесь. Он сообщает вам, что вы пытаетесь назначить неизвестный список для [a';b']. Что если через год вы измените этот код так, чтобы первый список, [a;b], подвергся рефакторингу в другое место в коде, чтобы вы его не видели, а функция f была изменена таким образом, чтобы она иногда возвращает другой список? Затем вы иногда получите исключение во время выполнения, пытаясь сопоставить [a';b'] с неправильным списком. Компилятор не может проверить правильность кода, отсюда и предупреждение.

Почему бы не написать

 let (a', b', c') = ( f a, f b, f c);;

Это не так много работы, чтобы написать это, но совершенно безопасно от любых будущих изменений в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...