2014-12-11 5 views
3

Я использую файл ресурсов для строк, а затем использую также те, у кого есть заполнители, и нужно форматировать строки.Ошибка F # с помощью sprintf и формата

У меня есть (о) следующий код в моем проекте:

let create s = sprintf (Printf.StringFormat<_>(s)) 

let formatstring = "%s:%d" // this is actually then gotten from the resource strings 

let createsomespecificstring s d = create formatstring s d 

let resultstring = createsomespecificstring "123" 123 

Этот код работает, когда я использую F # 3.0. Перестановка его скомпилировать его с 3.1, он компилирует, но дает ошибку во время выполнения:

Unable to cast object of type 'Fi[email protected][Microsoft.FSharp.Core.Unit,System.String,System.String,System.String,System.String]' to type 'Microsoft.FSharp.Core.FSharpFunc 2[Microsoft.FSharp.Core.FSharpFunc 2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.PrintfImpl+PrintfEnv 3[Microsoft.FSharp.Core.Unit,System.String,System.String]],Microsoft.FSharp.Core.FSharpFunc 2[System.String,Microsoft.FSharp.Core.FSharpFunc`2[System.String,System.Object]]]'.

Если Im выполнения кода в REPL он не работает на всех с:

stdin(28,5): error FS0030: Value restriction. The value 'resultstring' has been inferred to have generic type val resultstring : '_a
Either define 'resultstring' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

Приведенный выше код несколько поражений цель сильной печати снова, но ее вид приятный, когда у вас есть строки ресурсов.

Я делаю что-то неправильно (кроме того, упомянутый выше)?

Любые идеи о том, как сделать это лучше и даже заставить его работать (особенно в 3.1)?

Edit: После первого ответа (который работает в данном конкретном случае) число вариантов форматирования/аргументы «случайная» длина:

let formatstring = "%s:%d:%d" 
let createsomespecificstring s d d' = create formatstring s d d' 
let resultstring = createsomespecificstring "123" 123 345 

Тогда он не работает снова.

+0

Вы пробовали 'let resultstring: string = createomespecificstring ...'? – kvb

+0

@kvp * лицоpalm * no I hadnt. Я мог бы даже сделать это на «более высоком уровне», а затем он работает. let createomespecificstring s d d ': string = create formatstring s d d' .... подтверждено. к плохому вы не писали это как ответ. и плохой я сам этого не видел. спасибо! –

+0

Я могу помочь! – kvb

ответ

1

Аннотации типа как подсказки @kvp являются «правильным» ответом.

let createsomespecificstring s d d' : string = create formatstring s d d' 

Это делает это в fsi, а в f # 3.1, когда составлено на тестах, которые я сделал.

0

Вот решение, которое работает по крайней мере в FSI:

let create s = sprintf (Printf.StringFormat<_ -> _ -> string >(s)) 
let formatstring = "%s:%d" // this is actually then gotten from the resource strings 
let createsomespecificstring s d = create formatstring s d 
let resultstring = createsomespecificstring "123" 123 

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

+0

Да, да. В этом конкретном случае. Это не работает, хотя если изменить formatstring на f.i. «% s:% d:% d», а затем далее в коде ... –

+0

вправо, но везде код используется, скажем, «createssomespecificstring», вы знаете длину, поэтому просто создайте несколько версий для всех длин, которые вы необходимость –

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