2016-09-03 2 views
1

Так я получаю следующее сообщение об ошибке:Printfn Ошибка в списке «(„список ->“Список б) не совместимы»

The type '('a list -> 'b list)' is not compatible with any of the types 
byte,int16,int32,int64,sbyte,uint16,uint32,uint64,nativeint,unativeint, 
arising from the use of a printf-style format string 

И это код, который устанавливает его:

let rec multC c = function 
    | [] -> [] 
    | head::tail -> c * head::multC c tail 


let p1 = [1; 2; 3];; 
let resMultC = multC p1 
printfn "resMultC: %d" resMultC 

Я не могу из-за любви ко мне выяснить, почему он не будет печатать, что я предполагаю, что означает ошибка. Любые намеки?

+1

'multC' принимает два аргумента, вы только поставили один. Может быть, [F # явное совпадение против синтаксиса функций] (http://stackoverflow.com/q/1839016/636019) прояснит ... – ildjarn

+0

Возможно, я что-то неправильно понимаю, но я не совсем уверен, что я должен получить от ссылку, которую вы предоставили. – Khaine775

+1

'function' делает больше, чем вы, вероятно, думаете, что это так - в частности, он действует как аргумент, делая вашу функцию двоичной, а не унарной. – ildjarn

ответ

2

Если вы отметите multC подпись в FSI, то это c:int -> _arg1:int list -> int list. Это означает, что он принимает два аргумента (один явно объявлен как c, другой - неявно из объявления function).

Это говорит, что проблема с вашим кодом является то, что вы предоставляете только один аргумент

let resMultC = multC p1 

вместо двух

let resMultC = multC 2 p1 // [2; 4; 6] 

Но даже сейчас последний звонок wan't компиляции, как вы пытаетесь для печати списка с использованием форматирования int (%d). Используйте %A вместо F # -специфических типов:

printfn "resMultC: %A" resMultC // resMultC: [2; 4; 6] 
+0

Ницца, спасибо за помощь. Использование FSI для проверки - отличный трюк. – Khaine775

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