2012-04-16 6 views
6

그래, 나는 튜플 목록이 전이 적이 지 여부를 결정하는 함수를 만들려고한다. 즉 (x, y)와 (y, z)가리스트에 있다면, x , z)도 목록에 있습니다.목록 통합에 '통일'

예를 들어, [(1,2), (2,3), (1,3)]은 전 이적입니다.

자, 프롤로그 배경에서 오는, 다음은 나에게 의미가 있습니다 :

transitive xs = and [elem (x, z) xs | (x, y) <- xs , (y, z) <- xs ] 

그러나, 그것은 작동하지 않습니다. 'y'는 예상 한대로 단일 값을 얻지 못하지만 두 번째 튜플의 경우 '재 할당'됩니다. 대신 다음을 사용해야합니다.

transitive xs = and [elem (x, z) xs | (x, y1) <- xs , (y2, z) <- xs, y1 == y2 ] 

왜 이렇게할까요? 첫 번째 예제에서 오류가 발생하지 않는 이유는 무엇이며 함수 프로그래밍 언어의 '참조 투명성'원칙에 위배되지 않는 이유는 무엇입니까?

"그러나 순수 함수 및 논리 언어에서 변수는 표현식에 바인딩되어 참조 투명성의 요구 사항으로 인해 전체 수명 동안 단일 값을 유지합니다." - Wikipedia

감사합니다.

+0

코드를 형식화하는 법을 배우십시오. – Marcin

+0

Will will, my apologies – Jarmex

+0

사과 할 필요가 없습니다. 그래서 새로운 사용자에게 경고해야 할 의무가 없으므로 거의 모든 새 사용자가 거의 언제든지 알려야합니다. – Marcin

답변

8

기능적 언어 일지라도 이름 섀도 잉이 있습니다. 때로는 유용합니다. 첫 번째 코드에서 (y,z) <- xsy(x,y) <- xs으로 바운드합니다.

경고가 표시되면서 컴파일하여 경고를받습니다.

+3

감사합니다. '섀도 잉'이라는 문구를 사용한 후에 매우 비슷한 질문을 발견했습니다. 이미 답변되었습니다. http://stackoverflow.com/questions/4053789/variables-in-haskell. 시간 내 줘서 고마워 :) – Jarmex

관련 문제