나는 과거 하스켈과 도박을 해왔고, 최근에 심각하게 그걸로 돌아 왔고, 나는 실제 세계의 하스켈을 읽고있다. 그들이 빛난 몇 가지 예는 아직 이해하지 못했습니다. 다음과 같이 :누군가 나에게 하스켈 함수를 설명 할 수 있을까요?
myLength [] = 0
myLength (x:xs) = 1 + myLength (xs)
이 작동 방식이 보이지 않습니다. 1이 실제로 추가되는 이유는 무엇입니까? 재귀는 어떻게 추가 할 수있는 어떤 것을 반환합니까? 나는 그것을 얻지 않는다.
그리고 여기에 우리는이 하나 있습니다
splitLines [] = []
splitLines cs =
let (pre, suf) = break isLineTerminator cs
in pre : case suf of
('\r':'\n':rest) -> splitLines rest
('\r':rest) -> splitLines rest
('\n':rest) -> splitLines rest
_ -> []
isLineTerminator c = c == '\r' || c == '\n'
어떻게이 작품은, 정말 너무 무엇을 부착하고 사전입니다 않습니다를? 나는 사건 표현의 결과가 어떻게 pre가 연결될 수 있는지를 보지 못한다. 어쩌면이 함수의 평가를 자세히 설명하는 누군가가 필요할 수도 있습니다. 나는 아주 중요한 것을 놓치고 있어야합니다.
미리 감사드립니다.
EDIT : 복사 붙여 넣기가 실패했습니다. 죄송합니다.
편집 2 : 내 혼란은 이러한 기능이 실제로/돌아 왔는지와 관련이있는 것처럼 보이지만 지금은 모두 해결되었습니다. 대답 녀석 주셔서 감사합니다, 그것은 결국 클릭! 감사합니다! 이 정의와
myLength [] = 0
myLength (x:xs) = 1 + myLength (xs)
, 빈리스트의 myLength
는 (x:xs)
귀갑은 첫 번째 항목으로 목록을 압축을 풉니 다 0입니다 :
나는 이것이 어떻게 작동 하는지를 이해하지만, 지금 이것이 왜 효과가 있는지에 관해서는 분실했다. 결과는 다른 재귀 호출이거나 빈 목록입니다. 본질적으로, 그것은 pre가 모든 반복되기 전에 연결되는 것처럼 보이지만, case 표현은 pre를 반환하지 않습니다. 혼란스러워. – Rayne
실제로 다시 읽은 후, pre가 결과가 아닌 splitLines의 인수에 연결되는 것처럼 보입니다. 나는 이것이 []를 반환 할 재귀 호출 이상의 것을 반환하는 방법을 모르겠다. 나는 내가 생각한만큼 재귀를 이해하지 못한다고 생각한다. \ – Rayne
함수를 보면, case 표현식은 결과 인 재귀 호출의 결과 인 재귀 호출의 결과를 반환하는 것처럼 보인다. 재귀 호출의 [], []를 반환 할 때까지 계속됩니다. 나는이 상황에서 휴식이 연계되어있는 것을 보지 못한다. – Rayne