최근에 술어 함수를 다른 함수에 전달해야하는 상황이 발생했습니다. 필자가 자주 찾는 논리는 본질적으로 "이 값이이 패턴과 일치합니까?"입니다.
패턴 일치는 선언, do블록 및 목록 이해 에서 선호되는 것처럼 보이지만 술어를 취하는 많은 함수가 있습니다. a -> Bool여기서 패턴을 전달하는 것이 매우 편리합니다. 예를 들어, takeWhile, until, find, span, 등
지금까지 나는 \a -> case a of MyCons _ -> True; otherwise -> False명명 된 함수 a la를 작성 let myPred (MyCons _) = True; myPred _ = False in했지만, 둘 다 아주 추악하고 관용적이지 않은 것처럼 보입니다. "명백한"(그리고 잘못된) 방법은 비슷 \(MyCons _) -> True하지만 부분적이고 자연스럽게 오류를 발생 시키며 심지어 더 깨끗한 방법이 있어야한다고 생각합니다.
이런 종류의 일을하는 간결하고 깨끗한 방법이 있습니까? 아니면 완전히 잘못된 방향으로 가고 있습니까?
let myPred...스타일이 나쁘다고 생각할 필요는 없지만 매우 간단한 아이디어를 기대할 때보 다 훨씬 장황하게 느껴져 잘못된 트리를 짖는 지 궁금해집니다.
maybe :: b -> (a -> b) -> Maybe a -> band와 같은 데이터 유형에 대해 대 / 소문자를 구분하는 (해체) 함수를 정의한 bool :: a -> a -> Bool -> a다음 부울 생성 함수와 함께 인수로 사용하는 것입니다. 예를 들어 myCons z f (MyCons x) = f x ; myCons z f _ = z,을 호출하십시오 myCons False (const True) aMyConsValue. 이것은 거의 당신이 쓴 것입니다. 기능 인수 (들)를 통해 한 단계 더 "간접"/ "추상"을가집니다.
let싫어하는 조항에 매우 만족할 것where입니다. 물론이 유틸리티가 두 번 이상 필요한 경우에는 최상위 기능으로 정의해야합니다.