기본 규칙은 FP 프로그래밍 기능에서 객체가 OO 프로그래밍에서 수행하는 것과 동일한 작업을 수행한다는 것입니다. 당신은 그들의 메소드를 호출 할 수 있고 (어쨌든 "call"메소드) 캡슐화 된 내부 규칙에 따라 응답합니다. 특히, 모든 적절한 FP 언어를 사용하면 함수에 클로저 / 어휘 범위를 지정하여 "인스턴스 변수"를 사용할 수 있습니다.
var make_OO_style_counter = function(){
return {
counter: 0
increment: function(){
this.counter += 1
return this.counter;
}
}
};
var make_FP_style_counter = function(){
var counter = 0;
return fucntion(){
counter += 1
return counter;
}
};
다음 질문은 인터페이스가 무엇을 의미합니까? 하나의 접근 방식은 공칭 인터페이스를 사용하는 것입니다 (공통 인터페이스에 따르면 인터페이스에 적합 함).이 방법은 일반적으로 사용하는 언어에 따라 달라 지므로 후자를 위해 남겨 두십시오. 인터페이스를 정의하는 다른 방법은 구조적 방법으로, 어떤 매개 변수가 수신하고 반환하는지 확인합니다. 이것은 동적 오리 형식 언어에서 볼 수있는 일종의 인터페이스이며 모든 FP와 매우 잘 맞습니다. 인터페이스는 입력 매개 변수의 유형과 함수에 반환되는 유형입니다. 인터페이스에 맞는 올바른 유형!
따라서 인터페이스와 일치하는 객체를 나타내는 가장 간단한 방법은 단순히 기능 그룹을 갖는 것입니다. 일반적으로 함수를 일종의 레코드로 포장하여 함수를 별도로 전달하는 추악함을 극복합니다.
var my_blarfable = {
get_name: function(){ ... },
set_name: function(){ ... },
get_id: function(){ ... }
}
do_something(my_blarfable)
노출 된 기능이나 기능 레코드를 사용하면 많은 상용구없이 "무 지방"방식으로 대부분의 일반적인 문제를 해결할 수 있습니다. 그보다 더 고급 기능이 필요한 경우 언어에 따라 추가 기능이 제공되기도합니다. 언급 된 사람들의 한 예는 Haskell 유형 클래스입니다. 유형 클래스는 본질적으로 유형을 해당 함수 레코드 중 하나와 연관 시키며 사전을 암시하여 적절하게 자동으로 내부 함수에 전달하도록 항목을 작성할 수있게합니다.
-- Explicit dictionary version
-- no setters because haskell doesn't like mutable state.
data BlargDict = BlargDict {
blarg_name :: String,
blarg_id :: Integer
}
do_something :: BlargDict -> IO()
do_something blarg_dict = do
print (blarg_name blarg_dict)
print (blarg_id blarg_dict)
-- Typeclass version
class Blargable a where
blag_name :: a -> String
blag_id :: a -> String
do_something :: Blargable a => a -> IO
do_something blarg = do
print (blarg_name blarg)
print (blarg_id blarg)
그러나 유형 클래스에 대해 유의해야 할 중요한 점은 사전이 사전과 OO 버전에서 발생하는 것과 같은 값이 아니라 유형과 연관되어 있다는 것입니다. 이는 타입 시스템이 "타입"을 혼합 할 수 없음을 의미합니다 [1]. "blargables"목록이나 blargables로 가져 오는 이진 함수를 원한다면 typeclasses는 모든 것을 같은 유형으로 제한하지만 사전 접근 방식은 다른 출처의 blargable을 가질 수 있습니다 (어떤 버전이 더 나은지 당신이 무엇인지에 달려 있습니다) 하기)
[1] "기존 유형"을 수행하는 고급 방법이 있지만 일반적으로 문제가되지 않습니다.