2013-06-10 1 views
1

하스켈을 처음 사용했습니다.람다 안에 하스켈 다중 바인딩

은 내가 주석을 해제

data Structure a = Single a | Multiple (a, Int) deriving (Show) 

encodeM ::(Eq a)=> [a]->[Structure a] 

encodeM l = map(\x -> (let size = length x 
      --h = head x 
      in if size>1 then Multiple (head x, size) else Single (head x) 
      ) 
     ) $ group l 

(아흔 아홉 하스켈 문제에서 운동 중 하나에 내 솔루션)이 코드를 "-h = 머리 X"내가 얻을 : "`입력에 오류가 구문 분석 = 람다 내부에 여러 개의 문 '하자' "내가 사용하는 경우

그러나

xxx l= let size = length l 
    h = head l 
     in size 

잘 작동은 왜 컴파일되지 않습니다"?

어디서

encodeM2 ::(Eq a)=> [a]->[Structure a] 

encodeM2 l = map(\x->if si>1 then Multiple (head x, si) else Single (head x) 
    where si = length x) 

에 의해 수 있도록 대체하기 위해 시도하지만, 무슨 잘못 그것뿐만 아니라 컴파일되지 않습니다?

답변

2

하스켈에서 whitespace matters.

귀하의 에 지정자를 정렬하십시오. 그리고 람다에서는 where을 사용할 수 없습니다.

11

이 제대로 들여 쓰기 코드입니다 :

: 이것은 관용적 인 코드를

encodeM :: Eq a => [a] -> [Structure a] 
encodeM = map runLength . group 
    where 
    runLength x = 
     let size = length x 
      h = head x in 
     if size > 1 
     then Multiple (h, size) 
     else Single h 

입니다 :이 읽을 수있는 코드가

encodeM :: Eq a => [a] -> [Structure a] 
encodeM l = map (\x -> let size = length x 
          h = head x in 
         if size > 1 
          then Multiple (h, size) 
          else Single h) $ 
       group l 

입니다합니다 (let 바인딩이 수직으로 정렬하는 방법을 참고)

encodeM :: Eq a => [a] -> [Structure a] 
encodeM = map runLength . group 
    where 
    runLength [x] = Single x 
    runLength xs = Multiple (head xs, length xs) 
+2

감사합니다. 새로운 언어로 올 때, 당신은 습관을 바꿔야 만합니다. (습관은 이미 당신이 가진 언어들입니다.) 새로운 구문과 다른 생각으로 그것을 조정해야합니다. 귀하의 조언에 감사드립니다. – Blezz

4

나는 if/then/else와 일치하는 패턴을 사용하십시오. 따라서 코드는 다음과 같습니다.

encodeM :: (Eq a) => [a] -> [Structure a] 
encodeM lst = map fun $ group lst 
       where 
       fun [x] = Single x 
       fun l = Multiple (head l, length l) 
+0

그래, 그게 더 우아한, thx 동의합니다. – Blezz