나는 다음과 같은 유형의 서명으로 함수가 있다고 가정 :사용 항목
g :: a -> a -> a -> b
가 나는 또한 a
의 목록이 나는 적어도 세 가지를 포함합니다 알 - 그래이 xs
를 호출들-하자 항목. xs
의 처음 세 항목에 g
을 적용하고 싶습니다. 나는 다음과 같이 연결자를 정의 할 수 있습니다 알고
($$$) :: (a -> a -> a -> b) -> [a] -> b
f $$$ (x:y:z:_) = f x y z
그럼 난 그냥 g $$$ xs
를 사용할 수 있습니다. 이렇게하면 $$$
은 uncurry
과 약간 비슷하지만, 동일한 유형의 인수가 세 개인 튜플 대신 목록에 사용됩니다.
표준 결합자를 사용하여이를 관용적으로 수행 할 수있는 방법이 있습니까? 아니면, 하스켈에서 이것을하는 가장 관용적 인 방법은 무엇입니까? $$$
의 non-infix 버전에서 pointfree
을 시도하면 어디서부터 시작해야할지 생각해 볼 수 있다고 생각했지만 출력은 head
및 tail
및 ap
및 소수의 괄호가 소수 인 1flip
과 약간 씩을 나타 냈습니다.
(NB : 처음에는 할 스케이프가 아니라는 것을 알고 있지만, Parsec을 사용할 때 합리적인 해결책 인 것처럼 보입니다. 확실히이 최선의 대답이 "적이 실제 코드에서이 작업을 수행하지 않는다"동의하지만, 나는 ((->) r)
모나드 또는 무엇이든을 포함하는 일부 영리한 트릭을 볼 원합니다.) 제 생각이에서
코드에 어떤 문제가 있는지 보지 않습니다. 그것은 짧고 중요한 것입니다. 모든 것이 (또는되어야한다) pointfree가 아니어야한다. – sepp2k
필자는 거기에 아무 문제가 없다고 생각하지 않는다. $$$와 같은 새로운 연결자를 정의하지 않고도이를 수행 할 수있는 간결한 방법이 있는지 궁금하다. –
이것은 부분적인 함수이므로, 일반적으로 나쁜 아이디어 일 것입니다 :) 당신은'($$$) :: (a -> a -> b) -> [a] -> 아마도 b' –