2016-10-18 2 views
2

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

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

тогда моя идея

module Vector = 
type Vector = V of array<_> 
let (+) (v1:Vector) (v2:Vector) = Vector.map2 (+) V1 V2 

, но это не работает, потому что функция map2 не declaret векторов еще и это вопрос, как я могу объявить функцию map2 для нового типа с тем же proberties ad array?

ответ

4

Функция map2 уже существует для массивов, поэтому вы можете ее повторно использовать.

Но учтите, что если вы используете функцию с привязкой к (+), она будет доступна только внутри типа, поэтому вместо этого вы должны использовать статический член.

Затем вызвать существующую map2 функцию можно использовать по шаблону для снятия компонуйте Single-Case дискриминированных-Союз:

type Vector<'t> = V of array<'t> with 
    static member (+) (V v1, V v2) = V (Array.map2 (+) v1 v2) 

Но если вы все еще хотите создать функцию map2 для вашего типа, в чтобы использовать его более общим способом, вы можете создать его следующим образом:

type Vector<'t> = V of array<'t> with 
    static member map2 f (V v1) (V v2) = V (Array.map2 f v1 v2) 
    static member (+) (v1, v2) = Vector<_>.map2 (+) v1 v2 
+0

У меня возник еще вопрос о обработке произвольных массивов. Я хочу создать другой тип, который имеет тип «массив массивов» Я тестировал массив2D и обнаружил, что работать с ним гораздо медленнее. (последовательности последовательностей) Я должен иметь свойство, что все внутренние массивы имеют одинаковую длину, но я думаю, что могу справиться самостоятельно. Но я не могу найти произвольный способ для обозначения массива массивов при объявлении типа. я пытался что-то вроде типа Matrix = M массива > – kam

+0

СРЮ для комментария выше я получил еще один вопрос об обработке произвольных массивов. Я хочу создать другой тип, который имеет тип «массив массивов», который я тестировал array2D, и обнаружил, что работать с ним гораздо медленнее. (последовательности последовательностей) Но я не могу найти произвольный способ для обозначения массива массивов при объявлении типа. Я пытался что-то вроде типа Matrix = M массива > или Тип матрицы <'a,'b> = M массива <'a,'b> (или <'a><'b>) но ВСЕГДА возвращается один одномерный массив. – kam

+1

@kam Я думаю, что лучше для вас и сообщества, если вы отправляете свои вопросы индивидуально. Вы получите больше видимости, чтобы другие люди могли ответить, кто может иметь лучшее решение, чем я. – Gustavo

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