2014-10-19 2 views
3

haskell이 다음 표현을 어떻게 evauate하는지 알고 싶습니다.Haskell - span elem : evaluation

span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy" 

결과는

("BOB","sidneyMORGANeddy") 

사람이 나에게 평가 과정을 설명 할 수있다? 왜 내가 위와 같이 분할되었는지 말할 수 없기 때문입니다.

+0

'A'.. 'Z'집합의 _ 문자가 첫 문자가 아니기 때문에 's'에서 분리됩니다. – MathematicalOrchid

답변

6

span은 첫 번째 부분이 지정된 조건부가 참인 가장 긴 접두사이고 두 번째 부분이 목록의 나머지 부분 인 방식으로 술어를 사용하여 목록을 두 개로 분할합니다. 즉, 첫 번째 부분은 takeWhile과 같이 얻어지며 두 번째 부분은 동일한 술어에 대해 dropWhile과 같이 얻어집니다.

이제 조건자를 살펴 보겠습니다. elem :: a->[a]->Bool은 지정된 요소가 주어진 목록에서 발견되는지 여부를 알려줍니다. 깔끔한 트릭은 두 개 이상의 인자의 기능은 중위 표기법으로 사용할 수 있다는 것입니다 :

x `elem` xs 

elem x xs과 동일합니다. 따라서,

`elem` xs 

은 중위 함수 섹션처럼 처리됩니다. \x -> elem x xs과 같습니다.

span에는 분할 할 목록의 요소가 ['A'..'Z'] 목록에서 발견 될 수 있는지 여부를 테스트하는 조건부가 주어집니다. 그래서리스트를 두 개로 나눌 것입니다 : 그것은 술어가 보유하지 않는 첫 번째 요소를 찾고, 그것은 분리 점입니다. 두 번째 파티션이 첫 번째 소문자로 시작하는 방식입니다.