F # Список функций - PullRequest
       16

F # Список функций

0 голосов
/ 03 мая 2010

Я пытаюсь получить список функций, но, похоже, появляется с пустыми руками. Основной код выглядит примерно так:

let doSomething var  =
    var

let doSomething2 var  =
    var

let listOfStuff = [doSomething; doSomething2]

и я получаю следующее исключение:

Ошибка 2 Ограничение значения. Значение 'listOfStuff' был сделан вывод, чтобы иметь универсальный тип val queue: ('_a -> '_a) список Либо определите' очередь 'как простой термин данных, сделайте его функцией с явными аргументами или, если вы делаете не намерены для него быть универсальным, добавить тип аннотаций. C: \ fsharp \ SentimentFramework \ TradeSignalProcessor \ Program.fs 16 9 TradeSignalProcessor

Я попытался добавить атрибут [<GeneralizableValue>], но это не сработало ...

Ответы [ 4 ]

3 голосов
/ 03 мая 2010

Вы хотите список, состоящий из функций? Я думаю, что это будет так:

let f x = x + 1
let g x = x + 1

let listOfFunc = [f; g]

Если вам нужно указать параметр, просто не забудьте использовать обозначение типа:

let f (x:string) = x + "1"
2 голосов
/ 03 мая 2010

Как уже отмечали другие, предоставление явных типов вашим функциям или списку решит вашу проблему. Причина этого заключается в том, что функции могут иметь универсальные типы, а (вообще говоря) значения не могут. Компилятор сделал вывод, что обе ваши функции имеют тип 'a -> 'a для любого типа 'a. Это означает, что ваш список будет иметь тип ('a -> 'a) list, который является универсальным типом и недопустим для значения. Указание явного типа, такого как let listOfStuff : (int -> int) list = ..., разрешит неоднозначность.

Сказав это, обратите внимание, что я не могу воспроизвести эту точную проблему в последней версии компилятора (F # 2.0.0.0). Похоже, что выражения списка можно обобщить (предположительно, поскольку они не имеют побочных эффектов). Однако я вижу аналогичную ошибку, когда вместо этого использую выражение массива.

1 голос
/ 03 мая 2010

Вы обнаружили «ограничение стоимости». Вы не можете определять общие «значения», такие как listOfStuff -array.

Есть несколько предыдущих вопросов на эту тему, которые могут оказаться полезными, и Microsoft пишет об этом в теме "Автоматическое обобщение" .

Редактировать : Дмитрий Ломов написал отличную статью на эту тему здесь: "Тонкие точки ограничения значения F #" .

0 голосов
/ 03 мая 2010

Списки должны иметь одинаковый тип. Попробуйте вместо этого использовать кортеж.

... и попробуйте сделать так, как подсказывает ошибка. Приведите ваши входные данные как минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...