2017-11-02 7 views
0

나는 [a, b, c, d,. . . ]에서 [(a, b), (c, d),. . .]. 이제이 작동하고 여기에 코드입니다 :하스켈 - 내 foldl 함수 작동을 시도 중

makeTuple :: [a] -> [(a,a)] 
makeTuple [] = [] 
makeTuple [a] = [] 
makeTuple (x:y:xs) = (x,y): (makeTuple xs) 

지금이해야 할 다음 일은 이것이다 : 이전 기능을 사용 foldl 및 람다를 사용하여, 두 개의 요소를 제품에 각각의 튜플로 변환 표현. 그리고 이것이 내가 가지고있는 것입니다 :

productTuple [x] = foldl makeTuple [] [x] 

지금 정확히 이것이 나에게 묻히는 것이 확실하지 않습니다. 나는 타입 선언과 그 밖의 것들과 분리 된 함수를 만들어야하는지 잘 모르겠다. 어쩌면 누군가가이 문제에 접근하는 것이 가장 좋은 방법인지 알 수 있습니다. 또한이 코드는 작동하지 않으며 이유를 알지 못합니다.이 부분에 대한 도움이 필요합니다. (람다를 사용하는 것을 알지만 실제로 사용하는 방법은 잘 모르겠다. 도움이 필요한 또 다른 부분이다.) 정말로 고마워 할 것이다.

+0

의 몇 가지 예를? –

+0

productTuple을 공백으로 처리해야하므로 'productTuple (x : xs)'및 'productTuple []'을 구현해야합니다. – altschuler

+0

힌트 : 목록을 입력으로 사용하는'foldl'을 어떻게 쓰겠습니까 (기본적으로'id' 함수)? –

답변

0

람다 함수는 서명을 존중해야

마지막 기능은 볼 수 있었다 같은 :

productTuple :: Num a => [a] -> [a] 
productTuple xs = foldl (\acc (a, b) -> acc++[a*b]) [] (makeTuple xs) 

당신은 당신의`makeTuple` 기능을 사용할 필요가 말한다 foldl function here

I tried this code here

-1

연습 문제는 makeTuple으로 입력 목록을 전처리 한 다음 폴드 오버 할 것을 요구합니다.

productTuple :: [Int] -> [Int] 
productTuple xs = foldl (some lambda) something (makeTuple xs) 

그것은 그것을 할 수있는 가장 편리한 방법은 아니지만,이 운동의 포인트는 단지 그것의 이익을 위해 foldl를 사용하도록 강제하는 것이라고 생각한다.

[a] -> (b,b) -> [a] 

어큐뮬레이터는 타입 A] 상기 튜플

는이 \acc (a, b) -> acc++[a*b] 같은 람다를 시도 할 수있다 (b, b) 형태를 갖고 있습니다

+0

OP의'makeTuple'을 사용하면 형식 오류가 발생합니다. 하나의 목록 만 인수로 사용합니다. – gallais

+0

@gallais 고침, 고마워. – chi