У меня немного проблем со следующей FSharp/F # кодом:F # Тип Несоответствие кэррите функции
module File1
let api a =
printf ("VALUE = %A") a
let router ops =
[|
api (ops (fun (list, _) -> list()))
api (ops (fun (_, get) -> get 1))
|]
let withContext ops handler =
let context = "CONTEXT"
handler (ops context)
let operations context =
printf ("CONTEXT = %s") context
let list() = [|1;2;3|]
let get id = "Test"
(list, get)
let setup() =
let ops = withContext operations
router ops
Результатов в следующей ошибке
Results in the following compation error
Error 1 Type mismatch. Expecting a
((unit -> int []) * (int -> int []) -> int []) -> 'a
but given a
((unit -> int []) * (int -> string) -> 'b) -> 'b
The type 'int []' does not match the type 'string'
Я знаю, что проблема заключается в том, что функция ops обязана возвращать int [], но я хочу также иметь возможность возвращать строку.
Я думаю, что мне не хватает трюка с некоторыми общими декларациями, но после нескольких часов движения кода я не могу работать.
(я упростил код, чтобы выделить мою проблему)
Всего несколько замечаний: '' [| ... |] '' - это массив, а '' [...] '' - это список. '' api'' должен быть '' 'T -> unit'', правильно? Поэтому '' router ops'' должен быть '' unit [] '', массив единиц. Это то, что вы хотите? – BitTickler
Как сделать много типов в 1 тип? Дискриминационные союзы.'' type OpKinds = | Массив из int -> int [] | Строка int -> string'' – BitTickler
Это будет частью приложения suave.io, поэтому типы возвращаемых данных могут быть любым числом, поэтому я не уверен, что попытка создания огромного списка дискриминационных союзов будет работать. – davidtme