2015-10-20 2 views
0

В F #
"Hello"+"World" данные "HelloWorld". Я имею в виду, оператор + может конкатенировать строки.Тип 'Список <int>' не соответствует типу 'string'

Given this code: 
let iprint list:List<int> = 
let stringList=int2String4List list   //convert the int list to string list 
List.foldBack (fun acc elem -> acc+elem+',' ) stringList "" 

, но я столкнулся с ошибкой:

The type 'List<int>' does not match the type 'string' 

Это, мне кажется, F # интерпретировали тип данных stringList как межд тем временем это List<string>. но я не знаю, как это происходит?

List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State 

Это означает, что тип данных первого параметра функции и список должен быть таким же, но почему она настаивает на том, чтобы принять + как int оператора, а не оператор строки?

+0

Что такое подпись функции 'int2String4List'? – Petr

+0

let rec int2String4List (список: Список ): Список Salman

+0

Изменить подпись функции: 'let iprint (список: Список ) =' – Petr

ответ

1

Вы пропустили круглые скобки в объявлении функции, поэтому аннотация типа (List<int>) была применена к возвращаемому значению функции. Это будет компилировать:

let iprint (list:List<int>) = 
    let stringList=int2String4List list 
    List.foldBack (fun acc elem -> acc+elem+",") stringList "" 

Кстати, это не ваша int2String4List просто List.map string?

Кроме того, параметры fun acc elem -> ... в порядке. Если вы проверите тип ожидаемой функции List.foldBack, вы увидите, что это 'T -> 'State -> 'State - первым параметром является элемент списка, второй - это аккумулятор. Существует не так много различий в образце вы публикуемую (оба 'T и 'State являются string), но есть разница, если вы хотите, чтобы сократить его:

let iprint list = 
    List.foldBack (fun elem acc -> (string elem) + "," + acc ) list "" 

Как @JoelMueller заметил в своем комментарии, самый короткий и быстрый способ достижения этого результата:

let iprint = 
    List.map string >> String.concat "," 
+0

Да, это так. Я просто использую мое. – Salman

+1

Да, 'List.map string >> String.concat", "' и меньше, и работает лучше, потому что не выполняет повторную наивную конкатенацию строк. –

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