2016-10-13 3 views
1

Я новичок в функциональном программировании, и я пытаюсь выполнить эти инструкции в цикле, но он дает мне сообщение о том, что вкладки не разрешены в f #. пожалуйста помоги. Это может содержать больше ошибок, пожалуйста, исправьте меня, если я ошибаюсь.F #: Как выполнить несколько операторов в цикле

open System 
let sum:int32=0,sum2:int32=0,sum3:int32=0; 
let function1(num:int32) = 
for i = 1 to num do 
    sum = sum + i 
    sum2 = sum2 + (i+1) 
    sum3 = sum3 + (i+2) 
printfn "%i %i %i" sum sum2 sum3 

function(11) 
+0

Я удивлен, что никто не связан [это] (https://www.emacswiki.org/emacs/TabsSpacesBoth). Я также добавил версию с функциями более высокого порядка и т. Д., Которые перенастраивают список. – s952163

ответ

2

Прежде всего, вы должны прочитать введение в базовое F# syntax. Это ниже не очень идиоматическое F #, одна из целей функционального программирования - избегать изменяемых переменных.

open System 
let mutable sum = 0 
let mutable sum2 = 0 
let mutable sum3 = 0 
let function1 num = 
    for i = 1 to num do 
    sum <- sum + i 
    sum2 <- sum2 + (i+1) 
    sum3 <- sum3 + (i+2) 
    printfn "%i %i %i" sum sum2 sum3 

function1 11 

Вы должны запустить эту функцию пару раз и понять, почему это не очень хорошая идея. Подсказка: вы должны хотя бы определить изменяемые переменные внутри области функции.

Редактировать А вот версия с различными список функций манипулирования:

let sumFunc2 num = 
    [for i in 1..num -> 
    List.init i (fun x -> x+1)] 
    |> List.map List.sum 
    |> List.mapi (fun i x -> [x;x+i+1;x+2+2*i]) 

sumFunc2 4 
+1

Не должен ли быть «| List.last» в конце в sumFunc2? –

+0

@HenrikHansen Это хороший вопрос и действительно зависит от намерения OP. В его Q printfn находится вне цикла for, но это не сработает. Причина в том, что ОП определяет переменные суммы, затем определяет функцию, затем запускает функцию. Фактически таким образом он ничего не напечатает (хорошо 0,0,0 в первый раз). Вот почему я вытащил printfn внутри цикла for. Теперь возможно, что printfn все еще находится внутри функции, но вне цикла for. Тогда вы, безусловно, можете пометить в List.last, но преимущество в том, что вы можете, если хотите, но вам не нужно это делать. – s952163

+1

OK, хорошие аргументы :-) –

1

Я бы сказал, что сообщение об ошибке говорит само за себя: Не используйте вкладки, используйте пробелы.

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

Семантически это не будет делать то, что вы хотите. = - оператор равенства в F #, а не присвоение. Плюс переменные по умолчанию неизменяемы. Чтобы сделать то, что вы хотите, вам нужно объявить переменные как изменчивые и использовать оператор присваивания <-.

Тем не менее, результатом этого будет не функциональное программирование, а просто обязательное программирование, выполненное в F #. Функциональным способом было бы использовать функции более высокого порядка и/или рекурсию и вообще не изменять переменные.

+1

это, к примеру, я уверен, что синтаксически недействителен: 'let sum: int32 = 0, sum2: int32 = 0, sum3: int32 = 0; ' – s952163

+2

@ s952163 Вы правы, я пропустил это. Я только смотрел на петлю. Это, похоже, единственное. – sepp2k

1

Как уже отмечалось, изменяемые переменные почти (практически) в функциональном программировании/F #. Вместо этого все дело в обработке последовательностей данных.

Я часто нахожу List.fold очень полезным в тех местах, где я бы использовал итерацию на других языках, таких как C++ или C#.

Простое решения с List.fold вашего вопроса может быть:

open System 

let tripleSum n = 
    [1..n] |> List.fold (fun (s1, s2, s3) x -> (s1 + x, s2 + 1 + x, s3 + 2 + x)) (0, 0, 0) 

[<EntryPoint>] 
let main argv = 
    let sum1, sum2, sum3 = tripleSum 3 
    printfn "%d, %d, %d" sum1 sum2 sum3 

    Console.ReadLine() |> ignore 
    0 // return an integer exit code 

В tripleSum над последним (0, 0, 0) является начальными значениями семян для трех сумм, и они подытоживают функция кратного (fun (s1, s2, s3) ->... называется для каждого элемента в списке [1..n]

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