F # проблемы с вызовом функции, которая принимает целое число и возвращает строку - PullRequest
0 голосов
/ 22 сентября 2018

Я довольно новичок в программировании на F #, и сейчас я работаю над проектом с функцией, которая принимает целое число и возвращает строковое значение.Моя проблема (см. Мой код ниже) заключается в том, что независимо от того, что я делаю, я не могу вернуть значения моей str, вызывая мою функцию.

let mulTable (n:int):string = string n
let mutable m = 1
let mutable str = ""

while m < 10 do
    str <- "m\t" + str
    m <- m + 1
printfn "%A" (mulTable str)

Моя идея заключается в том, что я хочу сохранить значениеm, в str, så, что str в конце цикла while содержит значения «1 2 3 4 5 6 7 8 9».Но независимо от того, что я пробую, мой printfn "% A" mulTable str возвращает «это выражение должно иметь тип int, но здесь есть тип string».Я попытался преобразовать мой str в строку с изменяемым значением, например:

let mutable str = ""
let mutable str1 = str |> int

, а затем я пытаюсь вызвать мой str1, используя функцию mulTable вместо вызова str.Но все равно это не работает.

Что мне здесь не хватает?Я пробовал каждое возможное решение, которое только мог придумать, но не смог решить мою проблему.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

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

open System

let xs = [1..9] |> List.map string 
//you should avoid using mutable variables, and instead generate your list of numbers with an list comprehension or something similar.
String.Join("\t", xs) 
//A little exploration of the List/Array/String classes will bring this method up: "concatenates the members of a collection using the separator string.

Это дает мне:

val it: string = "1 2 3 4 5 6 7 8 9"

0 голосов
/ 22 сентября 2018

Исправление вашего собственного алгоритма может быть следующим:

let getSequenceAsString max =
    let concat s x = sprintf "%s\t%i" s x
    let mutable m = 1
    let mutable str = ""

    while m < max do
        str <- concat str m
        m <- m + 1
    str
printfn "%A" (getSequenceAsString 10)

Но, как показали другие, большую работу можно выполнить проще:

open System
let getSequenceAsString max = 
    String.Join("\t", [1..max-1])

Если вы хотите, чтобы каждое число возвращалось так, как вы просите в комментарии, это можно сделать следующим образом:

let getSequenceAsString min max = 

    let revert x = 
        let rec rev y acc =
            match y with
            | 0 -> acc
            | _ -> rev (y / 10) (sprintf "%s%i" acc (y % 10))
        rev x ""

    String.Join("\t", ([min..max-1] |> List.map revert))

printfn "%A" (getSequenceAsString 95 105)

Gives: 
"59     69      79      89      99      001     101     201     301     401"
0 голосов
/ 22 сентября 2018

Я скорректировал код, чтобы он давал результаты, аналогичные тем, которые вы хотели:

let mulTable (n:int):string = string n
let mutable m = 1
let mutable str = ""

while m < 10 do
    str <- mulTable m+ "\t" + str
    m <- m + 1
printfn "%A" (str)

Я использовал ваш mulTable для преобразования m в строку, но для printfn вы нене нужно использовать это, потому что str уже является строкой.Тем не менее, результат будет 9 8 7 6 5 4 3 2 1

Существует более одного способа отменить строку, один из них будет разделить строку на массив символов и затем вернуть массив,Из полученного массива мы снова будем строить новую строку.Это будет выглядеть примерно так:

printf "%A" (new System.String(str.ToCharArray() |> Array.rev ))

Редактировать

Чтобы достичь того же результата, я бы предложил использовать более функциональный стиль, используя рекурсию и избегая мутирующих переменных.

let getNumbersString upperLimit = 
    let rec innerRecursion rem acc=
        match rem with
            | 0 -> acc
            | _ -> innerRecursion (rem-1) (sprintf "%i "rem::acc)
    innerRecursion upperLimit [] |> String.concat ""

getNumbersString 9

В результате val it : string = "1 2 3 4 5 6 7 8 9 "

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