2016-11-14 10 views
1

내가 xyz으로 값 x을 교체하고, 그렇지 않으면 아무것도 할 수있는 기능을 생각하고, 즉 :"replace-if"를 수행하는 가장 좋은 방법은 무엇입니까?

\x -> if x == y then z else x 

그것은 단지 내 프로그램에서 한 번 사용되는 그것은 중간에 있어요 함수 체인이므로 명명 된 함수로 정의하고 싶지는 않으며 람다식이 불필요하게 길게 보입니다. 대신, 나는 다른 기능을 사용하여 그것을 작성하려고합니다.

(ap . flip . bool id $ const z) (== y) 

이 같은 간단한 기능에 대한 더 나은 점없는 형태가 있습니다 그러나, 지금까지 나는 단 하나의이 비밀 (및 cring-Y)와 함께 올라와있다?

+1

나는 첫 번째 지적 버전보다 더 좋은 것은 없다고 생각합니다. – chi

+0

@chi : 아마도. 그러나 나는'my. 굉장해. (\ x -> x == y이면 z else x). 기능. 체인 $ val'. : P – trVoldemort

+2

'''where'' 절에서 정의하지 않는 이유는 무엇입니까? –

답변

5

나는 아주 읽을만한 것을 모른다.

execState (gets (==y) >>= flip when (put z)) 

fromMaybe <*> flip lookup [(y, z)] 
+5

나는이 대답들 중에서'bool z <*> (/ = y)'가 가장 나쁜 선택이라고 생각합니다. – duplode

4

나는이 것을별로 좋아하지 않지만, Hayoo searchdata-easy 패키지의 (?|) 운영자에게 나를 안내했다. 이 패키지는 그러한 기능들로 가득합니다 ("non-idiomatic haskell"에 대한 면책 ​​조항이 많음). 당신이 옆

\x -> if x == y then z else x -- the cluttered Haskell form 

\x -> x ?| (/= y) $ z   -- the "Pythonic" form 

(?| (/= y)) z     -- Haskell-sections-galore of the "Pythonic" form 

농담을 가질 수 것 같은데, 당신은 아마 좋아하는 것 또한 훨씬 더 합리적인 fromBoolC있다 :

import Control.Lens 

f = (^. non z) . (non y #) -- for some z and y 

if then else 버전은 다음과 같습니다

fromBoolC z (/= y) 
+0

'Data.Easy'는 해당 모듈의 이름을 * 흥미롭게 * 선택합니다 ... – duplode

+0

'Data.Easy'의 문서에서 직접 : "Note : 이것은 아마도 좋은 연습으로 간주되지 않을 것입니다. 표준 if-then- 그 대신에 거의 항상 더 명확 해졌습니다. 사실, 왜 내가 읽을 수있는 간단한 대안이 존재할 때 드문 기능을 찾아야합니까? – chi

4

lens에서 확실히 더 잘.

1

당신은 조회가있는 경우 문을 교체하는 파이썬 트릭을 사용할 수 있습니다 내가 얻을 수있는 최단는

bool z <*> (/= y) 

또한 어리석은 방법이다. pointfree.io에 따라

flip (join findWithDefault) (singleton y z) 

줄일 수있다

import Data.Map 

\x -> findWithDefault x x (singleton y z) 

그것은 정확히 분명하지 않다, 그러나 동시에 그것은 인자의 기능적인 부분을 분리한다. flip (join findWithDefault)은 원하는대로 처리하며, singleton y z은 DSL과 비슷한 예외 지정 방법입니다. 코드에 idExcept = flip (join findWithDefault)exception = singleton을 먼저 붙이면 체인이 거의 읽을 수 있습니다.

my . awesome . (idExcept (exception y z)) . function . chain $ val