2011-12-28 4 views
2

연습으로 나는 서곡의 흥미로운 부분을 수동으로 구현하려고합니다. 내가 포인트 무료로 갈 기회가있을 때마다 나는 그것을 가져 간다. 그러나 이것은 가장 가능성이 희박한 장소에서 벽돌 벽으로 나를 이끌었습니다. 이 코드 사용 :GHCI가 기능 점수를 무료로 쓰려고 시도하지 않았습니다.

myelem _ [] = False 
myelem x y = if x == head y then True else myelem x (tail y) 

notElem을 구현하려고합니다. 내 시도는 다음과 같습니다.

-- First 
mynotelem = not myelem 

일치하지 않는 유형으로 인해 부 풀릴 수 있습니다. 이것은 쉽게 해결되었습니다

-- Second 
mynotelem x y = not (myelem x y) 

인수 x와 y의 명시 적 선언이 추한 불필요한 느낌 그러나, 그래서 내가 다시 점 자유로운 스타일로 그것을 얻을하려고합니다. 제법

Couldn't match expected type `Bool' 
     with actual type `a0 -> [a0] -> Bool' 
In the second argument of `($)', namely `myelem' 
In the expression: not $ myelem 
In an equation for `mynotelem': mynotelem = not $ myelem 

실패

-- Third 
mynotelem = not $ myelem 

는 종류가 여전히 일치하지 않습니다. 근데 어떻게 고쳐? 다시 똑바로 점프 할 수 있습니다.

-- Fourth 
mynotelem x y = not $ myelem x y 

다음 중 어떤 기능이 작동하지만 위험한 부분은 서클에 가깝습니다. 나는 그것이 인수 중 하나 제거하는 것이 가능하다 발견 :

-- Fifth 
mynotelem x = not . (myelem x) 

하지만 성가신 X는 여전히 남아있다. 어떻게 제거합니까?

mynotelem x = not . (myelem x) 
      = (not .) (myelem x) 

지금이 f = (not .)g = myelem 그냥 h x = f (g x)임을 인식, 그래서 우리는 지적이없는 h = f . g(.) 연산자의 또 다른 용도로 쓸 수 있습니다 :

+2

ThelronKnuckle : 더 인수

mynotelem = ((.).(.)) not myelem 

, 패턴은 다음과 같이 계속 당신의 천국하는 경우 이미'($)'와'(.)'의 차이에 관한 질문을 검색하면 도움이 될 것입니다. –

답변

12

우리는 다음과 같이 코드를 다시 작성할 수 있습니다

: 더 인수 기능을 구성 할 때 패턴이 계속 방법
mynotelem = (not .) . myelem 

> let f x y z = x+y+z 
> (((sqrt .) .) . f) 1 2 3 
2.449489742783178 

또는, 당신은 또한 구성 사업자의 재미 보이는 구성으로 쓸 수 있습니다 :

> ((.).(.).(.)) sqrt f 1 2 3 
2.449489742783178 
+3

뻔뻔한 플러그, 나는 boob 운영자와 친구들에게 편리한 기능을 제공하기 위해 해커에게 "구성"패키지를 업로드했습니다. –

+3

가슴 운영자 XD 내 동료에게 밧줄을 낄 때 이점을 사용해야합니다 – TheIronKnuckle

+0

실제 코드에서 "가슴 연산자"를 사용하는 것이 일반적입니까? 이와 같은 상황을 처리하는 가장 깨끗한 방법은 무엇입니까? 포인트 ('mynotelem x = not. elem x' 또는'mynotelem x y = not $ elem x y')를 그대로 두는 것이 낫겠습니까? –

관련 문제