"포인트 프리"스타일이란 무엇입니까 (함수 프로그래밍에서)?
내가 최근에 눈치 챘던 문구는 "포인트 프리"스타일의 개념입니다 ...
그러다가 여기서 "논의 할 가치가있는 또 다른 주제는 저자들이 포인트 프리 스타일을 싫어한다는 것입니다."
"포인트 프리"스타일이란 무엇입니까? 누군가 간결하게 설명 할 수 있습니까? "자동"카레와 관련이 있습니까?
제 레벨에 대한 아이디어를 얻기 위해-저는 Scheme을 스스로 가르치고 있으며 간단한 Scheme 인터프리터를 작성했습니다. "암시 적"커링이 무엇인지 이해하지만 Haskell이나 ML을 모릅니다.
그냥 보면 위키 백과 문서 당신의 정의를 얻을 수 :
암묵적 프로그래밍 (점없는 프로그래밍)은 변수 대신 결합 자와 함수 구성 [...]을 사용하여 함수 정의에 인수 관련 정보가 포함되지 않는 프로그래밍 패러다임입니다.
Haskell 예 :
관례 (인수를 명시 적으로 지정) :
sum (x:xs) = x + (sum xs)
sum [] = 0
포인트 프리 ( sum
명시적인 인수가 없음 +
-0 으로 시작 하는 접힘 ) :
sum = foldr (+) 0
심지어 간단한 : 대신 g(x) = f(x)
, 당신은 쓸 수 있습니다 g = f
.
예 : 커링 (또는 기능 구성과 같은 작업)과 밀접한 관련이 있습니다.
Point-free 스타일은 정의되는 함수의 인수가 명시 적으로 언급되지 않고 함수 구성을 통해 정의된다는 것을 의미합니다.
두 가지 기능이있는 경우
square :: a -> a
square x = x*x
inc :: a -> a
inc x = x+1
이 두 함수를를 계산하는 함수에 결합하려면 다음 x*x+1
과 같이 "포인트 전체"를 정의 할 수 있습니다.
f :: a -> a
f x = inc (square x)
요점없는 대안은 논쟁에 대해 이야기하지 않는 것입니다 x
.
f :: a -> a
f = inc . square
JavaScript 샘플 :
//not pointfree cause we receive args
var initials = function(name) {
return name.split(' ').map(compose(toUpperCase, head)).join('. ');
};
const compose = (...fns) => (...args) => fns.reduceRight((res, fn) => [fn.call(null, ...res)], args)[0];
const join = m => m.join();
//pointfree
var initials = compose(join('. '), map(compose(toUpperCase, head)), split(' '));
initials("hunter stockton thompson");
// 'H. S. T'
점없는 스타일은 코드가 인수가 존재하고 사용되고 있더라도 명시 적으로 언급하지 않음을 의미합니다.
이것은 함수가 작동하는 방식 때문에 Haskell에서 작동합니다.
예를 들면 :
myTake = take
하나의 인수를 사용하는 함수를 반환하므로 원하는 경우가 아니면 인수를 명시 적으로 입력 할 이유가 없습니다.
다음은 다른 라이브러리가없는 TypeScript의 한 예입니다.
interface Transaction {
amount: number;
}
class Test {
public getPositiveNumbers(transactions: Transaction[]) {
return transactions.filter(this.isPositive);
//return transactions.filter((transaction: {amount: number} => transaction.amount > 0));
}
public getBigNumbers(transactions: Transaction[]) {
// point-free
return transactions.filter(this.moreThan(10));
// not point-free
// return transactions.filter((transaction: any) => transaction.amount > 10);
}
private isPositive(transaction: Transaction) {
return transactions.amount > 0;
}
private moreThan(amount: number) {
return (transaction: Transaction) => {
return transactions.amount > amount;
}
}
}
포인트없는 스타일이 더 "유창"하고 읽기 쉽다는 것을 알 수 있습니다.
참고URL : https://stackoverflow.com/questions/944446/what-is-point-free-style-in-functional-programming
'development' 카테고리의 다른 글
중괄호가 없을 때 Ruby에서 문자열 보간이 작동하는 이유는 무엇입니까? (0) | 2020.09.19 |
---|---|
Python-IndexError : py2exe를 사용할 때 튜플 인덱스가 범위를 벗어났습니다. (0) | 2020.09.19 |
생성자에 대한 Visual Studio의 비공개 필드 생성 바로 가기를 사용자 지정하려면 어떻게하나요? (0) | 2020.09.18 |
목록을 추가하는 방법 (0) | 2020.09.18 |
리플렉션을 통해 Java에서 클래스의 공용 정적 최종 필드 / 속성 값 가져 오기 (0) | 2020.09.18 |