Haskell 또는 다른 기능적 프로그래밍 언어로 프로그램을 어떻게 설계합니까?


52

c # 또는 ruby와 같은 객체 지향 프로그래밍 언어에 대한 경험이 있습니다. 객체 지향 스타일로 프로그램을 디자인하는 방법, 클래스 및 객체를 만드는 방법 및 그들 사이의 관계를 정의하는 방법을 알고 있습니다. 또한 일부 디자인 패턴을 알고 있습니다.

사람들은 어떻게 기능성 프로그램을 작성합니까? 그들은 어떻게 시작합니까? 기능적 언어에 대한 디자인 패턴이 있습니까? 극단적 인 프로그래밍이나 민첩한 개발과 같은 방법론이 기능적 언어에 적용 가능합니까?


답변:


24

많은 개념이 Erlang, Lisp (s) 및 ML과 같은 다른 기능적 언어에도 동일하게 적용되지만, 주로 Haskell을 중심으로 답변을 작성합니다. 일부는 심지어 루비, 파이썬, 펄, 자바 스크립트에도 어느 정도 적용됩니다.

사람들은 어떻게 기능성 프로그램을 작성합니까? 그들은 어떻게 시작합니까?

함수를 작성함으로써. 함수형 프로그래밍을 수행 할 때을 작성 main중이거나 도우미 함수를 작성 중 입니다. 때로는 주요 목표는 작동하는 다양한 관련 기능을 가진 데이터 유형을 작성하는 것입니다.

함수형 프로그래밍은 하향식 및 상향식 접근 모두에 매우 적합합니다. Haskell은 고급 언어로 프로그램을 작성하고 고급 디자인의 세부 사항을 정의하는 것이 좋습니다. 참조 minimum예를 들어 :

minimum    :: (Ord a) => [a] -> a
minimum xs =  foldl1 min xs

목록에서 가장 작은 요소를 찾는 함수는 각 요소를 "누적 기"또는 현재 최소값과 비교하기 위해 min 함수를 사용하여 단순히 목록을 순회하는 것으로 작성됩니다.

기능적 언어에 대한 디자인 패턴이 있습니까?

"디자인 패턴", imho, 고차 함수모나드 와 같은 두 가지가 있습니다 . 전자에 대해 이야기합시다. 고차 함수는 다른 함수를 입력으로 사용하거나 함수를 출력으로 생성하는 함수입니다. 모든 기능적인 언어는 일반적으로 많이 사용한다 map, filter그리고fold(폴드는 종종 "감소"라고도 함) : 함수를 다른 방식으로 목록에 적용하는 3 가지 기본 고차 함수. 이것들은 아름다운 방식으로 보일러 플레이트를 대체합니다. 매개 변수로 함수를 전달하는 것은 프로그래밍에 매우 강력한 이점입니다. 고차 함수를 사용하고, 고유 한 함수를 만들 수 있으며, 유용한 함수로 가득 찬 강력한 표준 라이브러리를 활용할 수 있으므로 많은 "디자인 패턴"을보다 간단하게 달성 할 수 있습니다.

모나드는 "무서운"주제입니다. 그러나 그들은 그렇게 무섭지는 않습니다. 모나드를 생각하는 가장 좋아하는 방법은 버블에 함수를 포함시키고 해당 함수에 강력한 기능을 부여하는 것입니다 (버블 내부에서만 작동). 정교하게 만들 수는 있지만, 세상에는 또 다른 모나드 비유가 필요하지 않습니다. 간단한 예제로 넘어가겠습니다. 비 결정적 "디자인 패턴"을 사용하려고한다고 가정합니다. 다양한 입력에 대해 동일한 계산을 동시에 실행하고 싶습니다. 입력을 하나만 선택하고 싶지 않고 모두 선택하고 싶습니다. 이것이리스트 모나드 일 것입니다 :

allPlus2 :: [Int] -> [Int]
allPlus2 xs = do x <- xs
                 return (x + 2)

자, 이것을 수행하는 관용적 방법은 실제로 map이지만, 설명을 위해 목록 모나드가 어떻게 하나의 값에서 작동하는 것처럼 보이는 함수를 작성할 수 있었지만 목록? 다른 초강대국으로는 실패, 상태, "외부 세계와의 상호 작용"및 병렬 실행이 있습니다. 이러한 초강력은 매우 강력하며 대부분의 프로그래밍 언어를 사용하면 초강력 기능이 모든 기능을 손상시킬 수 있습니다. 대부분의 사람들은 Haskell이 이러한 초강대국을 전혀 허용하지 않는다고 말하지만 실제로 Haskell은 모나드에 포함시키기 때문에 효과가 제한되고 관찰 될 수 있습니다.

tl; dr 고차 함수와 모나드를 Grokking하는 것은 Haskell이 grokking 디자인 패턴과 동등합니다. 이러한 Haskell 개념을 익힌 후에는 "디자인 패턴"이 Haskell의 성능을 시뮬레이션하는 가장 저렴한 해결 방법이라고 생각하기 시작합니다.

극단적 인 프로그래밍이나 민첩한 개발과 같은 방법론이 기능적 언어에 적용 가능합니까?

이러한 관리 전략을 하나의 프로그래밍 패러다임과 연계시키는 것은 없습니다. phynfo가 언급 한 바와 같이, 함수형 프로그래밍은 실질적으로 강제 그래서 미니 이정표가 케이크 한 조각이어야한다, 당신은 하위 문제로 큰 문제를 깨고, 기능 분해를 할 수 있습니다. 작성하는 함수에 대한 속성을 테스트하거나 증명하기위한 QuickCheck 및 Zeno와 같은 도구가 있습니다.


"세련 할 수는 있지만 세상에는 아직 또 다른 모나드 비유가 필요하지 않습니다." -우리는 항상 모나드에 대한 더 많은 비유가 필요하며 당신의 것이 내가 본 것 중 최고입니다.
Adam Gent

1
좋은 대답이지만 디자인 패턴에 대한 토론은 약간 오해의 소지가 있다고 생각합니다. Haskell에는 OO / GOF 스타일의 디자인 패턴이 필요하지 않지만 실제로 시도하는 것은 우스운 일입니다. 패턴 자체는 커뮤니티가 여러 가지 문제에 대한 솔루션을 반복해서 전달하는 방법입니다. Haskell 커뮤니티는 아직 매우 어리기 때문에 아직 말할 패턴이 많지 않지만 Haskell 패턴의 예를 요청하면 GADT 또는 Arrowized FRP와 같은 것을 언급 할 것입니다.
rtperson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.