유닛이있는 구본의 무효
-
19-09-2019 - |
문제
이 두 프로그래밍 개념의 차이점이 무엇인지 이해하고 싶습니다. 첫 번째는 데이터 유형이 없음을 나타내고 후자에는 유형이 존재하지만 정보는 없습니다. 또한, 나는 단위가 기능 프로그래밍 이론적 기초에서 나온다는 것을 알고 있지만 여전히 단위 원시의 유용성이 무엇인지 이해할 수 없다 (예 : F# 프로그램에서).
해결책
단위 유형은 모든 것을 더 규칙적으로 만듭니다. 어느 정도까지 F#의 모든 기능을 단일 매개 변수를 취하고 단일 결과를 반환 할 수 있다고 생각할 수 있습니다. 매개 변수가 필요없는 함수는 실제로 "단위"를 매개 변수로 가져오고 결과를 반환하지 않는 함수는 결과적으로 "단위"를 반환합니다. 이것은 다양한 장점이 있습니다. 예를 들어, C#에서 값을 반환하는 다양한 구멍의 기능을 나타내는 "func"대의원과 값을 반환하지 않는 "행동"대의원을 모두 나타내는 방법을 고려하십시오 (예 : Func<int,void>
합법적이지 않습니다 - void는 '실제'유형이 아니기 때문에 그런 식으로 사용할 수 없습니다).
다른 팁
기능 프로그래밍에서 우리는 일반적으로 출력에 대한 입력을 매핑하는 것에 대해 말합니다. 이것은 말 그대로 인수를 반환 값에 매핑하는 것을 의미합니다. 그러나 무언가가 수학적/카테고리-이론적 의미에서 기능이 될 경우 돌아와야합니다. 무엇. ㅏ void
값은 함수가 아무것도 반환하지 않는다는 것을 나타냅니다.이 용어에서는 무의미합니다.
unit
기능적인 답변입니다 void
. 본질적으로 값이 하나만있는 유형입니다. ()
. 많은 용도가 있지만 여기에 간단한 것이 있습니다. 더 전통적인 명령적인 언어로 이와 같은 것이 있다고 가정 해 봅시다.
public static <T, U> List<U> map(List<T> in, Function<T, U> func) {
List<U> out = new ArrayList<U>(in.size());
for (T t : in) {
out.add(func.apply(t));
}
return out;
}
이것은 특정 기능을 적용합니다 func
목록의 모든 요소에 새로운 목록을 작성합니다. func
의 출력 유형. 그러나 주장을 인쇄하는 함수를 전달하면 어떻게됩니까? 출력 유형이 없으므로 무엇을 입을 수 있습니까? U
?
일부 언어에서는 그러한 함수를 전달하면이 코드를 중단합니다 (C#, 할당 할 수없는 C#예 : void
일반 유형). 당신은 an을 가지고있는 것과 같은 해결 방법에 의지해야합니다 Action<T>
, 그것은 어리석게 될 수 있습니다.
이것은 개념의 개념입니다 unit
유용합니다 : 그것 ~이다 유형이지만 단일 값 만 취할 수있는 유형. 이는 체인 및 구성과 같은 것들을 크게 단순화하고 걱정해야 할 특별한 경우의 수를 크게 줄입니다.