Разумно эффективный чисто функциональный матричный продукт в Haskell?

Я немного знаю Haskell, и мне интересно, возможно ли написать что-то наподобие матрично-матричного продукта на Haskell:

Pure-functional: no IO or State monads in its type signature (I don't care what happens in the function body. That is, I don't care if the function body uses monads, as long as the whole function is pure). I may want to use this matrix-matrix product in a pure function. Memory-safe: no malloc or pointers. I know that it's possible to "write C" in Haskell, but you lose memory safety. Actually writing this code in C and interfacing it with Haskell also loses memory safety. As efficient as, say, Java. For concreteness, let's assume I'm talking about a simple triple loop, single precision, contiguous column-major layout (float[], not float[][]) and matrices of size 1000x1000, and a single-core CPU. (If you are getting 0.5-2 floating point operations per cycle, you are probably in the ballpark.)

(Я не хочу, чтобы это звучало как вызов, но учтите, что Java может удовлетворитьall вышеперечисленного легко.)

я уже знаю, что

The triple loop implementation is not the most efficient one. It's quite cache-oblivious. It's better to use a well-written BLAS implementation in this particular case. However, one can not always count on a C library being available for what one is trying to do. I wonder if reasonably efficient code can be written in normal Haskell. Some people wrote whole research papers that demonstrate #3. However, I'm not a computer science researcher. I wonder if it's possible to keep simple things simple in Haskell. The Gentle Introduction to Haskell has a matrix product implementation. It wouldn't satisfy the above requirements though.

Адресация комментариев:

I have three reasons: first, the "no malloc or pointers" requirement is as yet ill-defined (I challenge you to write any piece of Haskell code which uses no pointers);

Я видел много программ на Haskell, не использующихPtr, Возможно, это относится к тому факту, что на уровне машинных инструкций будут использоваться указатели? Это не то, что я имел в виду. Я имел в виду уровень абстракции исходного кода на Haskell.

second, the attack on CS research is out of place (and furthermore I can't imagine anything simpler than using code somebody else has already written for you); third, there are many matrix packages on Hackage (and the prep work for asking this question should include reviewing and rejecting each).

Кажется, что ваши # 2 и # 3 одинаковы (& quot; использовать существующие библиотеки & quot;). Меня интересует матричный продукт как простой тест того, что Haskell может делать сам по себе, и позволяет ли он «делать простые вещи простыми». Я мог бы легко прийти к численной проблеме, в которой нет готовых библиотек, но тогда мне придется объяснить проблему, тогда как все уже знают, что такое матричный продукт.

How can Java possibly satisfy 1.? Any Java method is essentially :: IORef Arg -> ... -> IORef This -> IO Ret

На самом деле это коренится в моем вопросе (+1). Хотя Java не претендует на отслеживание чистоты, Haskell делает. В Java, чистая функция или нет, указывается в комментариях. Я могу утверждать, что матричный продукт является чистым, хотя я делаю мутацию в теле функции.The question is whether Haskell's approach (purity encoded in the type system) is compatible with efficiency, memory-safety and simplicity.

Ответы на вопрос(3)

Ваш ответ на вопрос