는을 감안할 때 :하스켈에서 포인트없는 패턴 매칭이 가능합니까?
data TwoInts = TwoInts Int Int
add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b
이 가능 a
및 b
의 이름을 지정하지 않고 add'em
을 작성하는 것입니다. 뭔가 같은 : 튜플 유사 통해
add'em TwoInts = (+) -- (Note: Fails to type check)
는을 감안할 때 :하스켈에서 포인트없는 패턴 매칭이 가능합니까?
data TwoInts = TwoInts Int Int
add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b
이 가능 a
및 b
의 이름을 지정하지 않고 add'em
을 작성하는 것입니다. 뭔가 같은 : 튜플 유사 통해
add'em TwoInts = (+) -- (Note: Fails to type check)
일반적으로 나는 아니오라고 말하고 싶습니다. 불가능합니다. 그러나 랩핑과 랩핑의 실용적인 문제 (특히 newtypes에서 흔히 볼 수있는 문제)를 해결하려는 경우, 종종 fmap과 유사한 mapf f (Type val) = Type (f val)
함수를 정의한 다음 익스포트하지 않습니다. 더 많은 함수를 전달하는 것만으로 n-ary 데이터 유형에 대해 동일한 작업을 수행 할 수 있습니다. 구현이 비밀로되어 있지 않은 경우,이를 (fary for unary) export 할 수도 있습니다. 패턴 매칭은 당신을 구현과 연결시킬 것이기 때문에 이런 종류의 맵 함수 나 복잡한 유형의 뷰를 추천한다.
기본 유형에는 이미 이러한 기능이 정의되어 있습니다. maybe
및 either
.
일반적으로 불가능하다고 말하는 이유는 무엇입니까? 명시 적 패턴 일치를 대체하는 생성자 및 deconstructor 함수를 항상 정의 할 수 있습니다. pointed Haskell 함수를 (임의로 복잡한) pointfree 버전으로 항상 번역 할 수 있습니다. 그래서 일반적으로 * 가능합니다. –
전문 용어 일 뿐이며, 헬퍼 기능을 필요로하지 않는 솔루션을 찾고 있다고 생각했습니다. 나는. point-free * 패턴 일치 *. 함수를 정의하면 point-free 함수입니다. 생성자를 파기하면 결과적으로 사건이 발생합니다. 컴파일러가 자동 데이터 인스턴스에 하나만 넣으므로 일반 프로그래밍 작업으로 말하지 않아도된다는 뜻입니다. –
'maybe'와'either'는 실제로 데이터 형식이 재귀가 아닌 경우에도 형식에 대해 fold입니다. 즉, 형식의 개체를 교회 인코딩으로 변환하기 때문에 접혀지지 않은 것입니다. 각 생성자에 해당하는 함수.반환 값을 작성하려면 해당 함수를 호출하면 데이터 유형의 생성자에 대한 호출이 대체됩니다. 'mapf'는'fmap'과 매우 유사 합니다만, 1 개의 파라미터를 가지는 생성자가 1 개있는 형태에 대해서만입니다. 그렇지 않으면 접기에 비유가 더 유용합니다. – Blaisorblade
,
data TwoInts = TwoInts { fst', snd' :: Int }
우리가 우리에게 좋은 표기법을주는
TwoInt
uncurry' f p = f (fst' p) (snd' p)
에 두 인수의 기능을 해제하는 동작을 정의 할 수 있습니다
:
add'em = uncurry' (+)
자, 이제 점을 'uncurry'로 옮겼습니다. – alternative
커리큘럼에 대한 유형 클래스를 만들 수도 있으므로 두 가지 이상의 요소에 적용 할 수 있습니다. – pat
@mathepic, uncurry는 pointfree로 작성할 수 있습니다. 'uncurry = ('ap'snd). (.fst)'. 열쇠는 패턴 일치를 없애고 있습니다. –
가능 : 예. 와이즈 : 꼭 그런 것은 아닙니다. –