Итерация по списку> ищем значение в F # - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть List<List<int>> в F #. Мне нужно перебрать его в поисках заданного значения val. В C # я бы сделал что-то вроде:

public bool contains(List<List<int>> list, int value)
    foreach (l in list ){
        foreach(val in l){
             if (val == value)
                 return true; //found value
        }
    }
    return false;
} 

Я ищу эквивалент в F #. Я попробовал следующее, но я делаю что-то не так, потому что я до сих пор не привык к синтаксису F #:

type foo = 
    {
     l : List<List<float>>

    }

let contains (value: float) : bool = 
   for row in foo.l do
       for val in row do
            if (val == value)
                true
   false

Указанный выше код неверен.

Может ли кто-нибудь подсказать мне, как этого добиться?

Ответы [ 2 ]

9 голосов
/ 30 ноября 2011

Другой, немного другой способ сделать это

let contains value items =
  items
  |> Seq.concat
  |> Seq.exists ((=) value)

или, более кратко

let contains value = 
  Seq.concat >> Seq.exists ((=) value)
4 голосов
/ 30 ноября 2011

Это прямой перевод вашего кода C #:

   let contains value (ls: _ list list) = 
       let mutable found = false
       for row in ls do
           if not found then
               for el in row do
                    if not found && el = value then
                        found <- true
       found

Чтобы изменить значение переменной в F #, вы должны использовать ключевые слова mutable или ref. Тем не менее, в F # делать функциональным образом:

let contains value ls  = 
     ls |> List.exists (List.exists ((=) value))

В отличие от for .. in ... do, который является синтаксическим сахаром, функция высшего порядка List.exists немедленно остановится, когда найдет ответ. Эта версия плохо масштабируется, если ваши списки большие. Вы можете преобразовать список в набор, чтобы быстрее находить элемент:

let contains value (ls: _ list list) = 
     ls |> List.concat |> Set.ofList |> Set.contains value

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