Как небольшая программа, чтобы немного узнать язык, я попытался реализовать метод linq Select
(обычно известный как Карта вне .net) в VB, однако мне кажется, что я «в работать с небольшой проблемой, она не позволит мне вызвать функцию рекурсивно, так как он считает, что типы не совпадаютНевозможно рекурсивно вызвать функцию в VB.NET
вот код:
Iterator Function Map(Of A, B)(fun As Func(Of A, B), input As List(Of A)) As IEnumerable(Of B)
If input Is Nothing Then
Yield Nothing
Else
Yield fun(Head(input))
Map(fun, Tail(input)) ' error here
End If
End Function
здесь следует отметить, что Head()
функция который возвращает первый элемент списка ввода, а Tail()
- это метод, который возвращает все, но первый элемент
Я сделал тест раньше, чтобы узнать, можно ли мне передать Func(Of A, B)
в функцию, как я здесь; он работал нормально, поэтому почему это не работает сейчас, я не знаю ...
Может ли кто-нибудь помочь в этом?
Я так привык к неявных преобразований, которые я полностью упускается из виду это. .. спасибо .. Также можно продолжать точно угадывать подписи головы и хвоста! –
Скажите мне, почему функция возвращает только один элемент, а не целую коллекцию? –
@ElectricCoffee: Потому что вы игнорируете возвращаемое значение «Карта». Простым решением будет «For v In Map (fun, Tail (input)): Yield v: Next'. Другим решением было бы не использовать функцию итератора, а скорее регулярную функцию и «Return func (Head (input)). Concat (Map (fun, Tail (input))). – Heinzi