#string #f#
#строка #f#
Вопрос:
let reverseString (myStr: string)=
myStr|>Seq.toList|>List.rev |> Array.ofList|>string
Я работаю в F # для этой функции. Я запускаю вышеупомянутый и хочу получить результат, например, я сделал
reverseString "abc"
Я ожидал, что это покажет cba
, но на самом деле это возвращает System.Символ[]. Итак, в чем может быть проблема, потому что я хочу видеть этот результат, подобный «cba», вместо этого, чтобы проверить, правильно я поступаю или нет. Спасибо!
Комментарии:
1. Странно, ваш код, кажется, работает нормально на моей стороне. Вы оцениваете это в F # interactive?
2. @katie у тебя есть
open System
инструкция над этим или твояString
строчная? Потому что, когда я используюstring
, я копирую ваш результат, но когда я используюSystem.String
, я получаю правильный результат.3. Вы также можете полностью определить псевдоним типа F #
string
(и использовать немного другой подход для меньшего количества преобразований):let reverseString (myStr : string) = myStr.ToCharArray () |> Array.rev |> Core.string
Ответ №1:
Я думаю, проблема может заключаться в путанице между конструктором System.String
и string
функцией.
string
функция преобразует любой объект в строку, в основном вызывая ToString()
который для массива символов просто выводит имя типа: System.Char[]
.
С другой стороны System.String
, класс имеет несколько перегруженных конструкторов, один из которых представляет собой массив символов, поэтому он создает строку:
[| 'a'; 'b'; 'c'|] |> string |> printfn "%A" // "System.Char[]"
[| 'a'; 'b'; 'c'|].ToString() |> printfn "%A" // "System.Char[]"
[| 'a'; 'b'; 'c'|] |> String |> printfn "%A" // "abc"
6 |> string |> printfn "%A" // "6"
6 .ToString() |> printfn "%A" // "6"
6 |> String |> printfn "%A" // error: no overloads for int
"abc" |> string |> printfn "%A" // "abc"
"abc" .ToString() |> printfn "%A" // "abc"
"abc" |> String |> printfn "%A" // Strangelly enough gives error too
Комментарии:
1. Что касается вашей последней строки: это совсем не странно, если вы понимаете, что у
System.String
этого нет конструктора, который принимает один аргумент типаstring
( learn.microsoft.com/en-us/dotnet/api /… ).