Я знаю Haskell немного, и мне интересно, можно ли написать что-то вроде матрично-матричного продукта в Haskell, что является следующим:
- Чистофункциональные: нет
IO
илиState
монады в своей сигнатуре типа (мне все равно, что происходит в теле функции. То есть меня не волнует, функция body использует монады, пока вся функция чиста). Я могу использовать этот матрично-матричный продукт в чистой функции. - Память: нет malloc или указателей. Я знаю, что можно "написать C" в Haskell, но вы теряете безопасность памяти. Фактически запись этого кода на C и его взаимодействие с Haskell также лишена безопасности памяти.
- Насколько эффективен, например, Java.. Для конкретности позвольте предположить, что я говорю о простой тройной петле, одинарной точности, непрерывной компоновке столбцов (
float[]
, notfloat[][]
) и матрицы размером 1000x1000 и одноядерный процессор. (Если вы получаете 0,5-2 операции с плавающей запятой за цикл, вы, вероятно, находитесь в шаге.)
(Я не хочу, чтобы это звучало как вызов, но обратите внимание, что Java может легко удовлетворять всем.)
Я уже знаю, что
- Реализация тройного цикла не самая эффективная. Это довольно кэш-невообразимо. Лучше использовать хорошо написанную BLAS в этом конкретном случае. Однако нельзя всегда рассчитывать на доступность библиотеки C для того, что вы пытаетесь сделать. Интересно, может ли быть достаточно эффективный код в обычном Haskell.
- Некоторые люди написали целые исследовательские работы, демонстрирующие № 3. Однако я не научный сотрудник. Интересно, возможно ли сохранить простые вещи в Haskell.
- Нежное введение в Haskell имеет реализацию матричного продукта. Однако он не удовлетворяет вышеуказанным требованиям.
Адресация комментариев:
У меня есть три причины: во-первых, требование "no malloc or pointers" пока еще не определен (я призываю вас написать любую часть Haskell код, который не использует указатели);
Я видел много программ Haskell, не использующих Ptr
. Возможно, это относится к тому, что на уровне машинной инструкции будут использоваться указатели? Это не то, что я имел в виду. Я имел в виду уровень абстракции исходного кода Haskell.
во-вторых, атака на исследования CS неуместна (и, кроме того, я не может представить ничего проще, чем использовать код, который кто-то еще уже написано для вас); в-третьих, существует множество матричных пакетов на Hackage (и подготовка к заданию этого вопроса должна включать рассмотрение и отклонение каждого).
Кажется, что ваши # 2 и # 3 одинаковы ( "использовать существующие библиотеки" ). Меня интересует матричный продукт как простой тест того, что Haskell может сделать сам по себе, и позволяет ли он "упростить простые вещи". Я мог бы легко найти числовую проблему, у которой нет готовых библиотек, но тогда я должен был бы объяснить проблему, тогда как все уже знают, что такое матричный продукт.
Как Java может удовлетворять 1.? Любой Java-метод по существу
:: IORef Arg -> ... -> IORef This -> IO Ret
Это относится к корню моего вопроса, фактически (+1). Хотя Java не претендует на отслеживание чистоты, Haskell делает. В Java, является ли функция чистой или нет, указывается в комментариях. Я могу утверждать, что матричный продукт чист, хотя я и мутация в теле функции. Вопрос в том, совместим ли подход Haskell (чистота, закодированный в системе типов) с эффективностью, безопасностью и простотой.