대수 데이터 유형으로 어떤 문제가 해결됩니까?


18

공정한 경고, 나는 함수형 프로그래밍을 처음 사용하므로 많은 나쁜 가정을 가질 수 있습니다.

나는 대수적 유형에 대해 배우고 있습니다. 많은 기능적 언어에는 이러한 기능이있는 것으로 보이며 패턴 일치와 관련하여 상당히 유용합니다. 그러나 실제로 어떤 문제를 해결합니까? C #에서 다음과 같이 겉보기에 (대부분의) 대수 유형을 구현할 수 있습니다.

public abstract class Option { }
public class None : Option { }
public class Some<T> : Option
{
    public T Value { get; set; }
}

var result = GetSomeValue();
if(result is None)
{
}
else
{
}

그러나 나는 이것이 객체 지향 프로그래밍의 개자식이라는 것에 대부분 동의 할 것이라고 생각하며, 절대 그렇게해서는 안됩니다. 그렇다면 함수형 프로그래밍은 이러한 스타일의 프로그래밍을 덜 거칠게 보이게하는 깔끔한 구문을 추가하는 것입니까? 내가 뭘 놓치고 있니?


6
함수형 프로그래밍은 객체 지향 프로그래밍과 다른 패러다임입니다.
Basile Starynkevitch 2016 년

@BasileStarynkevitch 내가 알고 있지만 F #과 같은 언어가 둘 다 있습니다. 문제는 기능적 언어에 대한 것이 아니라 대수 데이터 유형이 해결하는 문제에 대한 것입니다.
ConditionRacer

7
내가 정의 할 때 어떤 일이 발생 class ThirdOption : Option{}하고 당신은 줄 new ThirdOption()당신이 예상 한 위치에 Some나에게 None?
amon

1
합계 유형이있는 @amon 언어에는 일반적으로 허용하지 않는 방법이 있습니다. 예를 들어, Haskell은 다음과 같이 정의합니다 data Maybe a = Just a | Nothing( 예제 와 동일 data Option a = Some a | None) : 사후에 세 번째 사례를 추가 할 수 없습니다. 표시된 방식으로 C #에서 합계 유형을 에뮬레이트 할 수 있지만 가장 예쁘지는 않습니다.
Martijn 2016 년

1
"ADT가 해결하는 문제"가 적고 "ADT가 다른 방식으로 접근하는 방식"과 비슷하다고 생각합니다.
MathematicalOrchid

답변:


44

인터페이스와 상속이있는 클래스는 개방 된 세계를 보여줍니다. 누구나 새로운 종류의 데이터를 추가 할 수 있습니다. 주어진 인터페이스에 대해 전 세계, 다른 파일, 다른 프로젝트, 다른 회사에서 구현하는 클래스가있을 수 있습니다. 데이터 구조에 사례를 쉽게 추가 할 수 있지만 인터페이스 구현이 분산되어 있기 때문에 인터페이스에 새 메소드를 추가하기가 어렵습니다. 인터페이스가 공개되면 기본적으로 정지됩니다. 가능한 모든 구현을 아는 사람은 없습니다.

대수 데이터 유형은 이중으로되어 있으며 닫혀 있습니다. 데이터의 모든 사례가 한곳에 나열되며 작업을 수행 하면 변형을 철저하게 나열 할 수있을 뿐만 아니라 그렇게 하는 것이 좋습니다 . 결과적으로 대수 데이터 형식에서 작동하는 새로운 함수를 작성하는 것은 쉽지 않습니다. 그 대가로 기본적으로 전체 코드베이스를 살펴보고 every를 확장해야하기 때문에 새로운 사례를 추가하는 것은 복잡합니다 match. 인터페이스가있는 상황과 마찬가지로 Rust 표준 라이브러리에서 새로운 변형을 추가하는 것은 (공용 유형의 경우) 주요 변경 사항 입니다.

이것들은 표현 문제의 양면입니다 . 대수 데이터 유형은 불완전한 솔루션이지만 OOP도 마찬가지입니다. 둘 다 데이터의 사례 수, 사례가 변경되는 빈도 및 작업 확장 또는 변경 빈도에 따라 이점이 있습니다. (많은 현대 언어가 두 가지 모두를 제공하거나 비슷한 것을 제공하는 이유는 무엇입니까? 또는 두 가지 접근 방식을 모두 모 으려고하는 더 강력하고 복잡한 메커니즘을 사용하는 이유입니다.)


일치 항목을 업데이트하지 못하면 컴파일러 오류가 발생합니까 아니면 찾은 런타임에만 발생합니까?
Ian

6
@Ian 대부분의 기능적 언어는 정적으로 입력되며 패턴 일치의 철저 성을 점검합니다. 그러나 "모두 포착"패턴이있는 경우, 함수가 작업을 수행하기 위해 새로운 경우를 처리해야하더라도 컴파일러는 만족합니다. 또한 모든 종속 코드를 다시 컴파일해야합니다. 하나의 라이브러리 만 컴파일하여 이미 작성된 응용 프로그램에 다시 연결할 수는 없습니다.

또한, 패턴이 완전한지 정적으로 검사하는 것은 일반적으로 비싸다. SAT 문제를 최대한 해결하고 최악의 경우 언어는 임의 술어를 허용하므로이를 결정할 수 없습니다.
usr

@usr 언어가 완벽한 솔루션을 시도한다는 것을 알고 있지 않습니다. 컴파일러가 철저하다는 것을 이해하거나 충돌하고 타는 모든 경우를 추가해야합니다. 그래도 SAT와의 관계를 모르겠습니다. 감축과 관련이 있습니까? 그럼에도 불구하고 실제 프로그램으로 작성된 실제 코드의 경우 철저한 검사가 버킷에서 떨어집니다.

N 부울과 일치한다고 상상해보십시오. 그런 다음 (a, b, _, d, ...)와 같은 일치 절을 추가합니다. 캐치 올 사건은! clause1 &&! clause2 && ...입니다. 그것은 나에게 SAT처럼 보입니다.
usr

12

그렇다면 함수형 프로그래밍은 이러한 스타일의 프로그래밍을 덜 거칠게 보이게하는 깔끔한 구문을 추가하는 것입니까?

아마도 단순화 일 것입니다.

내가 뭘 놓치고 있니?

대수적 데이터 유형이 무엇인지 명확히하자 ( Haskell로 배우기 의이 미세한 링크 요약 ).

  • "이 값은 A 또는 B 일 수 있습니다"라는 합계 유형 입니다 .
  • "이 값은 A B입니다" 라고 표시된 제품 유형 입니다 .

귀하의 예는 실제로 첫 번째와 만 작동합니다.

누락 된 것은이 두 가지 기본 작업을 제공함으로써 기능적 언어로 다른 모든 것을 만들 수 있다는 것입니다. C #에는 구조체, 클래스, 열거 형, 그 위에 제네릭 및 이러한 동작을 제어하는 ​​규칙이 있습니다.

기능적 언어는 일부 구문과 결합하여 조작을이 두 경로로 분해하여 유형에 대한 깔끔하고 단순하며 우아한 접근 방식을 제공 할 수 있습니다.

대수 데이터 유형으로 어떤 문제가 해결됩니까?

다른 유형의 시스템과 동일한 문제를 해결합니다. "여기에 어떤 값을 사용할 수 있습니까?" -그들은 다른 접근법을 취합니다.


4
당신의 마지막 문장은 누군가에게 "선박은 비행기와 같은 문제를 해결합니다 : 운송 – 단지 다른 접근 방식을 취합니다"라고 말하는 것과 비슷합니다. 그것은 완전히 올바른 진술이며 또한 쓸모없는 진술입니다.
Mehrdad

@ mehrdad-나는 그것이 조금 과장되어 있다고 생각합니다.
Telastyn

1
의심 할 여지없이 대수 데이터 유형을 잘 이해하고 있지만 글 머리 기호 목록 ( "합계 유형은 ..."및 "제품 유형은 ...")은 더 이상 합집합 및 교차 유형에 대한 설명처럼 보입니다. 합계 및 제품 유형과 동일합니다.
pyon

6

패턴 일치가 옵션을 사용하는 가장 관용적 인 방법으로 간주되지 않는다는 사실을 알고 놀랄 수도 있습니다. 이에 대한 자세한 내용 은 스칼라 옵션 설명서를 참조하십시오 . 왜 이렇게 많은 FP 자습서가이 사용법을 권장하는지 잘 모르겠습니다.

대부분 누락 된 것은 옵션 작업을보다 쉽게하기 위해 작성된 많은 기능이 있다는 것입니다. 스칼라 문서의 주요 예를 고려하십시오.

val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")

각 지점의 유무를 확인할 필요없이 옵션에 대한 작업을 연결 하는 방법 map과 방법에 주목 filter하십시오 None. 그런 다음 마지막 getOrElse에 기본값을 지정하는 데 사용합니다. 어느 시점에서 유형 확인과 같은 "중대한"작업을 수행하고 있지 않습니다. 불가피한 유형 검사는 라이브러리 내부에서 수행됩니다. 하스켈은 모나드 또는 펑터에서 작동하는 많은 기능을 언급하지 않고 자체 분석 기능을 가지고 있습니다.

다른 대수 데이터 유형에는 고유 한 관용적 방식으로 작업 할 수 있으며 대부분의 경우 토템 기둥에서 패턴 일치가 낮습니다. 마찬가지로, 고유 한 유형을 만들 때 이와 유사한 기능을 제공해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.