Почему System.Вывод Char[], а не значение строки?

#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 /… ).