4

Clojure으로 함수 프로그래밍을 배우고 있으며, Clojure의 구문뿐만 아니라 기능적 패러다임에 대한 이론적 이해를 심화시키고 싶습니다.함수 적 프로그래밍의 공리

나는 어떤이다 재귀,지도 등의 각 기능 기술/추론하는에서 작성 가능하다, 서로, 관련된 나머지 단점 먼저 ANS을 줄이는 방법 공리 또는 공식을 찾고, 그리고 있어요 모든 것의 궁극적 인 공리.

예를 들어, 나는 maprecur, first, restcons 기능, 그리고 물론 그 자체가 map에 전달 된 매핑 기능을 사용하여 구현 될 수있다 깨달았다.

는 그 후, 나는 또한 mapreduce를 사용하여 구현하고 다시 recur, firstrest을 사용하여 구현 될 수있다 줄일 수 깨달았다. 또한 filterreduce으로 구현 될 수 있습니다.

내가 함수형 프로그래밍의 주위에 내 머리를 정리하기 시작 같은 느낌,하지만 가장 궁극적 인 빌딩 블록은 임의의 기능을 구성 할 수 추상화 또는 키워드의 최소한의 인 즉,있는 볼 여전히 어렵다 . 맵 예제를 사용하면 두 번째 방법은 추상화을 사용하여 같은 목표를 설정합니다. 그렇다면 큰 그림을 보는 데 도움이되는 기능적 패러다임의 궁극적 인 공리는 무엇입니까?

+1

이 경우 나는이 책을 체크 아웃 할 것을 권한다 : https://mitpress.mit.edu/books/little-schemer FP에 대한 놀라운 소개로, 기본적인 번호 만 사용하여 만드는 법을 보여줍니다. 요소의 또한 클래식 [SICP] (https://mitpress.mit.edu/sicp/full-text/book/book.html)은 많은 도움이 될 수 있습니다. 둘 다 lisp을 사용하기 때문에 이해를 클로저에 쉽게 전달할 수있다. – leetwinski

+0

함수 프로그래밍은 크게 Lamda Calculus에 뿌리를두고 핵심 공리는 아래의 amalloy 상태와 같다. –

+0

'map'도'for'로 바꿀 수 있다는 것을 잊지 마십시오 –

답변

5

람다 (clojure에서 fn)에서 다른 것을 파생시킬 수 있습니다. 예를 들어, fncons, firstrest을 유도 고전적인 운동을하자 : 궁극적 인 공리 람다 : 당신은 함수형 프로그래밍에 대한 공리의 집합을 원하는 경우

(defn cons [x y] 
    (fn [f] 
    (f x y))) 

(defn first [coll] 
    (coll (fn [x y] x))) 

(defn rest [coll] 
    (coll (fn [x y] y))) 

그래서 하나가있다. 다른 기능의 파생 방법에 대한 자세한 내용은

  • 등의 고전적인 Lambda the Ultimate 종이를 참조하십시오.
  • Programming with Nothing, 더 최근의 접근법. 이것은 루비 문법을 사용하지만, 람다 만 사용하는 언어 기능 때문에 문제가되지 않습니다.
  • SICP도 추상화 장벽의 가치를 설명하는 부분으로 car/cdr/cons를 람다에서 파생시키는 섹션을 포함합니다. 구현은 사용자가 설정 한 계약을 충족하는 한 중요하지 않습니다. 물론 SICP는 일반적으로 프로그래밍의 기초에 관심이 있다면 일반적으로 좋은 읽을 거리입니다. 이 답변에 대한 많은 혼란이 같은

이 코멘트에서 보인다; 나는 그것을 전에 보지 않은 사람들을 위해 설명하지 않는 것에 대한 나의 잘못이다.

모든 종류의 시퀀스에서 작동하는 진보 된 다형성 항목 인 clojure의 내장 된 first/rest 기능을 모두 다시 구현하지 않는 것이 좋습니다.오히려, 우리가 구현하는 세 가지 단점 협력 계약을 만족함으로써, 당신은 컬렉션을 구축 할 수 있도록/첫번째/정지 기능이 바로 람다와 Clojure에서의 실제 첫번째/휴식 같은

(= x (first (cons x y))) 
(= y (rest (cons x y))) 

당신 빌드 더 복잡한 일 ,하지만 전체 유형 시스템을 먼저 만들어야하므로 훨씬 더 복잡합니다.

(defn cons [x y] 
    (fn [f] 
    (f x y))) 

(defn first [coll] 
    (coll (fn [x y] x))) 

(defn rest [coll] 
    (coll (fn [x y] y))) 
user> (def integers (cons 0 (cons 1 (cons 2 (cons 3 nil))))) 
#'user/integers 
user> integers 
#object[user$cons$fn__2108 0x3fb178bd "[email protected]"] 
user> (first integers) 
0 
user> (first (rest (rest integers))) 
2 
+0

이것은 유망한 것처럼 보입니다. 그러나 나는 clojure 문서를 읽었을지라도 그것을 이해하지 못합니다. 이 책에서이 "고전적인 예"가 설명 되었습니까? 어떻게 콜렉션을 함수로 사용할 수 있습니까? 나는 이것을 clojure REPL에서 시도해 보았고'IllegalArgumentException Key는 정수 여야한다 '라는 오류가 발생했습니다. –

+0

나는 여기에서도 무슨 일이 일어나고 있는지 혼란 스럽다. 함수를 사용하여 콜렉션의 색인을 생성하고 있습니다. – Carcigenicate

+0

내 편집 기능이 향상 되었습니까? 처음과 휴식은 잘못이 아니었다. 오히려 의도 된 사용법은 분명히 분명하지 않았습니다. – amalloy

1

시작을 목록이 목록을보고 너무 많은 의미가 왜 대부분의 기능적인 언어, 의미 constructed 얼마나 이해함으로써 : 여기

이 운동을 보여주기 위해 의도 설명하는 예 REPL 세션의 firstrest입니다. 이 재귀 적 정의는 사용자가 변경 한 재귀 적 메커니즘을 이해하는 데 중요합니다.

처음으로 맵/필터/폴드 등이 실제로 haskell을 통해 진행되었는데, 실제로는 물건의 유형을 표현할 때 이점이있었습니다. 적어도 나를 위해, 초심자에게 이것은 많은 의미가있었습니다. 당신이 유형 a 소요 유형 b으로 변합니다, 당신은 유형 a의 목록을 제공하는 기능이있는 경우, 다음지도는 단순히 당신의 목록을 반환합니다 : 예를 들어

map는과 같이 서명 (a -> b) -> [a] -> [b]있다 b을 입력하십시오.

한 당신이 정말로 이해에 시간을 소요는 reduce가 입력 된 세계에서의 특별한 경우로되어있는 fold (leftright 모두)입니다. 일단 준비가 되었다면, 나는 낡은 것을 제안 할 것입니다. A tutorial on the universality and expressiveness of fold

내가 언급 한 모든 것을 시도하고 구현하는 것이 좋습니다. 이러한 기본적인 구성 요소와 그 의존성에 대한 이해가 많이 향상 될 것입니다. 감소 구현 (두 주름) recur의 관점에서가, recur의 측면에서 그리고 등 mapfiltertake 모두 구현 reduce 등 당신이 확률의 것과 유사한 공리의 간단한 설정을 찾을 수 있다고 생각하지 않습니다

+0

좋은 연습이지만'foldr'는 Clojure에서 Haskell보다 덜 유용합니다. 왜냐하면 우리는 지속적인 게으름이 없기 때문입니다. 직접 구현하고 대규모 콜렉션에서 실제로 사용하십시오. '또는 :: [Bool] -> Bool; 또는 = foldr (||) False'는 단락으로 인해 대규모 콜렉션에서 잘 작동하지만 Clojure의 버전은 좋지 않습니다. – amalloy

+0

@amalloy와 확실히 동의합니다. 나는 폴드가 무엇인지를 이해하고 자신의 차이점을 이해하는 것은 좋은 운동이라고 생각합니다. – Shlomi

1

이론, 예를 들면. [B A 또는 = P

  • P [A]> = 0마다 이벤트
  • P [ "모든 이벤트"] = 1
  • P를 들어 확률의 경우, 단지 3 개의 기본적인 공리 존재 [A] + P [B]는 & B가 상호 배타적 인 경우

그것은 모든 확률 통계 & 이러한 세 가지 기본 가정으로부터 유도 될 수있는 아주 놀라운 일이다.

"기능적 프로그래밍"은 그렇게 잘 정의되어 있지 않습니다. 실제로 주제에 관한 거의 모든 책은 100 개의 "전문가"에게 함수 프로그래밍을 정의하도록 요청하면 상호 호환되지 않는 100 개의 답변을 받게된다는 관찰과 함께 시작됩니다. 이 성명서는 단지 부분적으로 농담입니다.

함수 프로그래밍에 대해 실제로 말할 수있는 것은 그것이 전통적인 기능 외의 언어보다 기능을 강조한다는 것입니다. 이것은 실제로 예/아니오 관측보다는 기능적 언어 또는 기능 프로그래밍 스타일에 대한 "목표"입니다.

기능 프로그래밍의 목표는 항상 동일합니다.보다 단순함을 통한 비용 절감 & 신뢰성. 물론 컴퓨팅의 시작 이래로 모든 언어 & 기술은이 동일한 게임 계획을 가지고 있습니다.

  • 대신 설명서의
  • 증가 사용하는 기능에만 "&"증가 "없습니다"감소 "라는 것을

참고 루프 가변 변수의 사용을 줄입니다 FP는 기본적으로 그것을 달성하는 것을 목표로 "&"절대로 ". 이것이 의미하는 바를 판단하라는 결정을 내리면, 당면한 문제와 당신이 묻는 사람에 따라 대답이 달라질 것입니다.

두 문제 & 명이 시간이 지남에 따라 변경된다는 점에 유의하십시오. 오늘날 비용, 복잡성, 효율성, 유지 보수성 등과 같은 "최상의"절충안 인 해답은 문제, 사람, 도구, 하드웨어, 가격 등이 변화함에 따라 한 달 또는 한 해 "최상의"해답이 아닐 것입니다 시간이 지남에.

과학 교장을 기억하십시오. 그것은 당신 (이론)에 대해서만 생각하지 않고, 실험 (실험)을 강요합니다. 따라서 실제로 무언가를하고 결과를 관찰해야합니다.

소프트웨어에서 이것은 2 가지 (또는 그 이상) 방법으로 문제를 해결하고 각각의 접근 방식에서 "&"을 비교하는 것을 의미합니다.