2014-04-07 5 views
2

하스켈에서 단어 (문자열)와 문자 목록을받는 부울 함수를 만들어야합니다. 이 함수는 목록의 모든 문자가 문자열에 포함되어 있는지 확인해야합니다. 나는 약간 연구를 만들고 기능이 allelem다는 것을 것을을 발견했다 도움이 될 수 있었다.backticks가 작동하지 않는 함수 elem

예 :

word = "hello" 
list = ['h','o','e'] 

내 코드는 다음과 같은 형태는 :

allCharBelong word list = all (`elem` word) list 

나는 몇 가지 테스트를 만들어 (당신이 좋은 것 검사를 두 배로 할 경우) 완벽하게 작동합니다.

내 질문 : 왜 내가 elem에서 백틱을 꺼내면 함수가 작동하지 않습니까?

사용 : allCharBelong word list = all (`elem` word) list

작동하지 : allCharBelong word list = all (elem word) list

답변

6

(`elem` word) 부분적 번째 인수를인가하는 조작부, 그것은 elem word = (word `elem`) = \x -> elem word x 반면 \x -> elem x word 동등하다. 표현식에 유형에 주석을 달아 가끔 일어나는 일을 파악하는 데 도움이됩니다.

+0

감사합니다. – warty

+0

내가 원하는 기능을 수행하는 또 다른 방법일까요? (구성, 고차원 및/또는 부분 응용 프로그램 사용) – warty

+1

@warty 예 :''('elem' 단어) x = x'elem' word = (x'elem') word = elem x word = flip elem word x '',''('elem' word) = 플립 elem 단어''. –

0

역 따옴표를 추가하면 함수가 중첩됩니다. elem은 중위어 형태로 사용될 때 이진 연산자입니다.

elem char === \word -> elem char word -- can only apply partially to first arg 
1

그것은 작동하지 않습니다 다음 역 따옴표없이

(`elem` word) === \char -> elem char word -- apply to second arg 
(char `elem`) === \word -> elem char word -- apply to first arg 

elem 단지 일반 카레 기능입니다 : 우리가 적용하고있는 인수하는 중위 연산자 이전 또는 이후에 인수를 두는 것은 결정 왜냐하면 첫 번째 경우에는 "섹션"이라고 불리는 부분이 있습니다. 즉 중위 연산자의 부분적 적용입니다. 두 번째 경우에는 두 번째 인수를 고쳤으며, 두 번째 경우에는 첫 번째 매개 변수를 수정합니다. 당신이 부분적으로 오히려 인수, 첫 번째보다 두 번째의 기능을 적용 할 수 있습니다 : flip op val 대체 기록합니다 (역 따옴표가 읽기 때문에 unobstrusive 때문에, IMO 아주 좋은)

ghci> :t elem "string" 
elem "string" :: [[Char]] -> Bool 
ghci> :t (`elem` "string") 
(`elem` "string") :: Char -> Bool 
0

(`op` val)는 것입니다.

이러한 연산자 섹션은 물론 이미 중절 형태 인 함수와 함께 더 일반적으로 사용됩니다.

서곡> 맵 (! 4) .... "안녕하세요", "여보세요", "..Hello", "누구세요", "안녕하세요"]
"안녕하세요"
서곡> 맵 (/ 2)에 대한 설명 [10,20,30,40]
[5.0,10.0,15.0,20.0]

관련 문제