문제

함수형 프로그래밍 언어로 만들어진 진지한 과학 수학 라이브러리가 있습니까?함수형 언어의 특성상 특히 수학에 적합하다고 생각할 수 있지만, 잘 알려진 알고리즘은 절차적인 것 같습니다.

예를 들어, 클래식 수치적 레시피 시리즈는 거의 절차적인 방식으로 작성되었습니다. 라팩 많은 분야에서 거의 사실상 표준이지만 Fortran에 있으므로 절차적이거나 OO일 수도 있지만 확실히 기능적이지는 않습니다.

이러한 종류의 잘 알려진 절차적 알고리즘을 함수형 스타일로 전환할 수 있는 사람이 있습니까?

업데이트:함수형 언어를 사용하고 있는 것 같습니다. 상징적인 계산, 예를 들어매스매티카에서.그러나 본질적으로 호환되지 않는 것이 있습니까? 숫자 계산 및 기능적 알고리즘?아니면 명령형 알고리즘이 우연히 먼저 발명되었기 때문에 아무도 기능적으로 동등한 것을 고안하지 않았기 때문일까요?

도움이 되었습니까?

해결책

HackgagedB에는 숫자를위한 Haskell 라이브러리가 있습니다. hmatrix. Lapack, BLAS 및 GSL (GNU Scientific Library)에서 나옵니다.

그러나 명령형 알고리즘은 Monads (특히, State Transformers)를 사용하여 순수한 기능 언어로 쉽게 전송 될 수 있음을 명심해야합니다. 실제로, 효율적인 내부 구현은 일반적으로 이러한 메커니즘을 사용하여 순수한 기능적 언어로 변수 변수를 제공해야합니다.

기능적 스타일을 따르는 것은 많은 경우에 불가능합니다. 많은 문제의 경우 알려진 (효율적인) 기능적 접근법이 없습니다. 물론, 당신은 예를 들어 Haskell에서 이러한 알고리즘을 작동시킬 수 있지만 Matlab, Fortran 또는 C로 작성된 것과는 크게 다르지 않을 것입니다.

편집하다:

둘 다입니다 명백한 비 호환성과 문제가 먼저 나왔습니다.

  1. 효율적인 수치 알고리즘에는 일반적으로 변이 가능한 데이터가 필요합니다. 이것은 순전히 기능적인 설정에서는 가능하지만, 명령적인 언어만큼 간단하지는 않습니다. 그러나 두 계산 모델은 완벽하게 동일합니다.
  2. 기본 기계 (예 : 명령 세트)는 항상 예외가 거의 없으며 여전히 필수적이었고 여전히 필수적입니다 (!). 필수 코딩 된 알고리즘은 실제 기계를 모델링하는 방식을 고려하여 분석하고 최적화하기가 더 쉽습니다.
  3. 기본 수학은 기능적 솔루션에 대한 비교적 쉬운 파생을 허용하지만 효율적인 알고리즘을 얻지 못합니다 (수학에서 직접 필수 솔루션을 도출하는 경우와 마찬가지로). 대부분의 노력은 필수 솔루션을 향한 것이었고 여전히 기능적 대응 물은 단순히 알려져 있지 않습니다. 기능적 상대에 의해 기능적 의도와 스타일을 올바르게 표현하는 코드를 의미합니다.
  4. 재사용 할 수있는 필수 코드가 많이 있습니다. 그것의 대부분은 State Transformers를 사용하여 기능적 언어로 전사 될 수 있지만 여전히 필수적으로 보일 것입니다.

실제로 Haskell과 같은 순전히 기능적인 언어는 코딩 알고리즘에 도움이 될 수 있다고 생각합니다. 수학적 설명, 알고리즘 자체 및 일종의 유형 지향 증명 (즉, 사용 사용)을 통합 할 수 있습니다. 카레-하위 동형) 동일한 코드에서.

다른 팁

LaPack을 다시 작성하려고하지 않고 기능적 언어에서 블랙 박스로 사용했습니다. Lapack은 수십 년 동안 극도로 똑똑한 사람들에 의해 테스트, 미세 조정, 최적화 등을 테스트했습니다. 나는 그것을 만지지 않을 것입니다.

우수한 정신으로 컴퓨터 프로그램의 구조 및 해석, 도 있습니다 고전 역학의 구조와 해석. 이 책은 체계를 사용하여 역학에 대한 변형 접근법에 사용 된 많은 느슨한 수학적 표기법을 명확히합니다.

이 책의 초석은 scmutils 패키지, 여기에는 통합 및 최소화와 같은 많은 계산 작업에 대한 기능적 접근이 포함됩니다.

훌륭한 질문입니다!

나는 몇 년 동안 이 분야의 몇 안 되는 선구자 중 한 명이었고 최근에야 광범위한 문제에 대해 포트란과 같은 성능과 Python과 같은 간결성을 동시에 얻을 수 있는 지점에 도달했습니다.사용 가능한 모든 함수형 언어와 그 구현을 자세히 조사한 후, 나는 정적으로 유형이 지정된 불순 함수형 언어에 집중하기로 결정했습니다.오픈 소스 OCaml 프로그래밍 언어 그리고 마이크로소프트의 F# 프로그래밍 언어 .NET용.

내 책 과학자를 위한 OCaml 과학 컴퓨팅을 다룹니다. OCaml 프로그래밍 언어 Linux 또는 Mac OS X를 사용합니다.내 책 과학자를 위한 F# 과학 컴퓨팅을 다룬다 마이크로소프트의 F# 프로그래밍 언어 Windows와 Visual Studio를 사용합니다.우리 회사도 팔아요 숫자용 F# 그리고 시각화를 위한 F# 완전히 F#으로 작성되었으며 내부적으로는 함수형 프로그래밍을 광범위하게 사용하여 간결성, 명확성, 유지 관리 용이성을 향상하고 외부적으로는 라이브러리를 더 쉽게 사용할 수 있도록 하는 라이브러리입니다.예를 들어, 일류 함수를 사용하면 그래프를 정말 쉽게 그릴 수 있습니다.사인 함수를 플로팅합니다.

Plot([Function sin], (-5., 5.))

시각화용 F#은 모든 유형의 값을 시각화하려고 시도하므로 임의 정밀도의 유리수 행렬을 제공하면 결과가 조판 수학으로 표시됩니다..

우리는 OCaml 및 F# 언어 모두에서 기능적 스타일로 과학 컴퓨팅을 위한 코드를 작성하는 데 큰 성공을 거두었습니다.특히 F#을 사용하면 추상화로 인한 성능 저하 없이 일반적인 고성능 병렬 코드를 쉽게 작성할 수 있습니다.따라서 모든 유형의 행렬(단정밀도, 배정밀도, 복소수 또는 기호까지!)에 대해 작동하는 QR 분해를 구현할 수 있습니다. Intel MKL과 같은 공급업체 조정 라이브러리의 성능을 능가합니다.!

마지막으로, Mathematica는 제가 이 길을 개척하기 훨씬 전에 어떤 방식으로든 이 길을 개척했다는 점에 주목하고 싶습니다.그러나 그들의 해결책은 C로 작성된 숫자 및 기호 함수의 거대한 표준 라이브러리를 기존의 명령형 스타일과 결합하고 이러한 함수를 호출하는 다소 기초적인 함수형 프로그래밍 언어를 제공하는 것이었습니다.이들 접근 방식의 가장 큰 단점은 Mathematica로 작성된 일반 코드(예:시간이 대부분 표준 라이브러리에서 소비되지 않는 경우)는 C보다 약 1,000배 느립니다.

여러 컴퓨터 대수 시스템 (예 : Maxima)은 내부적으로 LISP 기반 언어를 사용하여 상징적 계산/구문 트리를 나타냅니다.

수학적, 기능적 언어의 예 :

http://en.wikipedia.org/wiki/J_(programming_language)

http://en.wikipedia.org/wiki/K_(programming_language)

어쨌든, 기능적 스타일에서 잘 만들어 지거나 효율적으로 공식화 할 수없는 몇 가지 수학적 문제와 알고리즘이 있습니다. 효율적인 구현은 항상 필수적입니다. 예 : Eratosthenes의 체

나는 Mathematica가 자신의 기능적 언어를 활용한다고 생각합니다.

"심각한"을 정의합니다. 기능적 언어 (LISP 이외의)는 꽤 새롭다는 것을 기억하십시오. Backes의 원본 논문은 70 년대 후반에만 있었고 생산 엔지니어링 기능 언어는 매우 새롭습니다. 잘 알려진 잘 받아 들여진 수치 패키지는 모두 60 년대 후반과 70 년대 초반에 시작하는 알고리즘과 코드를 기반으로합니다. 블라스 1979 년에 처음 출판되었습니다. 생산 사용을 위해 사람들은 잘 알고 신뢰할 수있는 패키지에 끌리는 경향이 있기 때문에 이전 Fortran 코드에는 큰 드라이브가 있습니다.

그러나 기능적 언어로 숫자 처리를하는 사람들이 있습니다. 또 다른 답변에서 지적한 바와 같이, Mathematica는 점점 더 많은 기능 수치 언어이며 점점 더 구현되고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top