Seq {/ * yielding sth * /}: ошибка с изменяемыми переменными - PullRequest
3 голосов
/ 20 октября 2011

Я пытаюсь выучить F # (я разработчик на C #) и сталкиваюсь с первой проблемой при попытке скомпилировать следующий код:


   let decompose n = 
       seq{
           let mutable c = n
           let mutable i = 2L
           if c%2L=0L then
               c <- c/2L
               yield 2L
           if (c=1L) then yield 1L
           else 
               while c<>1L do
                   if c % i=0L then
                       c<-c/i
                       yield i
                   else i <- i+2L
       }

Я пытался погуглить ошибку компиляции Google (см. Ниже), безуспешно (вероятно, потому что это на французском):

Переменная изменяемая 'c' est utilisée de manière incorrecte.Невозможно захватить переменные изменяемые переменные.Подтвердите, что вы можете использовать мутацию или использовать все, что нужно для изменения, изменяя все это через 'ref' и '!'.

Может ли кто-нибудь помочь мне исправить это?Или хотя бы дайте мне английскую версию ошибки?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Хорошо, ребята ... StackOverflow довольно хорошо спроектирован: мой ответ я нашел в следующем посте (в столбце «Связанные»):

Изменяемая переменная 'i' используется вневерный способ .?

Я не убираю свой вопрос для французских людей, которые будут гуглить эту ошибку!

Кстати, вот рабочий код:

let decompose n = 
    seq{
        let c = ref 0L
        c := n
        let i = ref 3L
        if !c%2L=0L then
            c := !c / 2L
            yield 2L
        if (!c=1L) then yield 1L
        else 
            while !c<>1L do
                if !c % !i=0L then
                    c:= !c / !i
                    yield !i
                else i := !i+2L
    }

// returns [|3;41|]
let dec = decompose 123L |> Seq.ToArray
0 голосов
/ 20 октября 2011

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

Изменяемая переменная 'c' используется недопустимым образом. Изменяемые переменные не могут быть захвачены замыканиями. Подумайте об исключении этого использования мутации или использовании выделенной в куче изменяемой эталонной ячейки через 'ref' и '!'.

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