가끔 "나는 마지막 인수를 두 번 사용하십시오."라고 표현하고 싶은 문제에 걸려 넘어집니다. pointfree 스타일을 작성하거나 람다를 피하기 위해. 예 :하스켈에서 "재사용"주장의 속임수?
sqr x = x * x
는
sqr = doubleArgs (*) where
doubleArgs f x = f x x
로 작성 또는 (this question에서 촬영)이 약간 더 복잡한 기능이 고려 될 수있다 : 같은 기능이 있다면
ins x xs = zipWith (\ a b -> a ++ (x:b)) (inits xs) (tails xs)
나는이 코드 pointfree를 작성할 수를 이 :
ins x = dup (zipWith (\ a b -> a ++ (x:b))) inits tails where
dup f f1 f2 x = f (f1 x) (f2 x)
그러나 doubleArgs 나 dup 같은 것을 Hoogle에서 찾을 수 없으므로 여기서 트릭이나 관용구를 놓칠 수도 있습니다. 확장
join :: (Monad m) -> m (m a) -> m a
join m = m >>= id
instance Monad ((->) r) where
return = const
m >>= f = \x -> f (m x) x
:
Control.Monad
에서
그리고'pointfree'에 따르면,'dup'은'liftM2'로 작동합니다.함수에 대한 모나드 인스턴스를보다 잘 처리 할 필요가 있습니다. –
이러한 문제를 해결하기 위해 ** 두 가지 방법을 사용해 주셔서 감사합니다. BTW 나는'sqr = (*) id'을 시도했고 그것은 잘 작동한다 :-) – Landei
'a ++ (x : b)'는 다른 것보다 3 글자 더 짧다. –