3

다음 간단한 average 함수를 pointfast 형식 (Ramda 사용)으로 변환하려면 어떻게해야합니까?Ramda를 사용하여 자바 스크립트에서 간단한 평균 함수를 pointfree 형식으로 변환하는 방법은 무엇입니까?

var _average = function(xs) { 
    return R.reduce(R.add, 0, xs)/xs.length; 
}; 

나는 잠시 동안 지금이 있었어요,하지만 R.divide 기능은 분자부터 저를 던지고 분모가 먼저 평가를 필요로

+2

읽을 가치가 있습니다. https://mail.haskell.org/pipermail/beginners/2011-June/007266.html – Xotic750

+1

가독성에 관해 좋은 점을 제기 해 주셔서 감사합니다. 그리고 "점이없는 스타일을 쓰기가 쉽지 않다면 아마도 읽기가 쉽지 않을 것입니다."_ 그러나 운동으로, 당신이 질문했을 때 어떻게 대답 할 수 있겠습니까? . – Chad

+0

솔직히 모르겠지만 두통처럼 보입니다. :) – Xotic750

답변

6

아래를 시도 할 수 있습니다 :

// average :: Array Number -> Number 
const average = R.converge(R.divide, [R.sum, R.length]); 

은 (R.converge보다는 어떤 더 일반적으로 적용 기능) R.lift 사용 :

// average :: Array Number -> Number 
const average = R.lift(R.divide)(R.sum, R.length); 
+0

그것들은 훨씬 더 깨끗하고 심지어 이해할 수 있습니다. 그들은 나에게 무의미 해 보입니다. 좋은 작업. :) R.average와 같은 것이 이미 존재하지 않는다는 것에 놀랐습니다. 그러나 내가보기에 더 많이 흥미 롭습니다. – Xotic750

+2

아하, [R.mean] (http://ramdajs.com/0.22.1/docs/# mean) – Xotic750

+0

오 예, 가장 쉽고 깨끗한 방법 인 R.mean이 있습니다. @ Xotic750 : Up으로 투표했습니다. – Karpak

5

여기 한 가지 방법이다 :

let xs = [5, 5]; 
 
let average = R.compose(R.apply(R.divide), R.juxt([R.sum, R.length])); 
 
console.log(average(xs));
<script src="//cdn.jsdelivr.net/ramda/latest/ramda.min.js"></script>

기본적 R.juxt 012로 배열 값을 매핑및 R.length은 배열의 길이와 배열의 길이를 가진 배열을 제공합니다. 결과는 R.divide에 적용됩니다.

+0

'pointfree'가'무의미한 '것으로 알려진 이유는 무엇입니까? 그냥 농담이지만, 그것은 나에게 매우 고통스럽게 보입니다. :) – Xotic750

+0

알아내는 데는 시간이 좀 걸렸지 만 그렇게 나쁘지는 않다고 생각합니다. 나는 그것에 익숙하지 않다. 중위 표기법도별로 도움이되지 않습니다. – MinusFour

+0

Up 투표 됨. 나는 이것이 완벽한 pointfree soln이라고 느낀다. OP가 쓴 것을 기반으로 제공되는 것입니다. – Karpak

0

당신은 R.converge를 사용하여 하나의

var _sum = function(xs) { 
    return R.reduce(R.add, 0, xs); 
}; 

var _average = function(xs) { 
    return R.divide(_sum(xs), xs.length); 
}; 

console.log(_average([3,4,5,6])); 

하거나

var _average = function(xs) { 
    return R.divide(R.reduce(R.add, 0, xs), xs.length); 
}; 

console.log(_average([3,4,5,6])); 
+0

이것은 내 머리에 훨씬 덜 고통 스럽다. 나는 그들이'pointfree'에 익숙하지 않기 때문에 그들이 OP의 요구 사항을 충족한다고 가정합니까? – Xotic750

+2

'_sum' 함수는'R.reduce (R.add, 0)'로 작성하는 편이 낫습니다. - 래핑 (wrapping) 함수가 필요 없습니다. 또한 ['R.sum'] (http://ramdajs.com/0.22.1/docs/#sum)을 사용하면됩니다. ;) – davidchambers

+0

피드백을 보내 주셔서 대단히 감사합니다. 나는 Ramda 라이브러리와 포인트 프리 기능에 대해 OP의 게시물을 본 후에 만 ​​들었습니다. 이 게시물에 신속하게 답변하고 뭔가를 얻은 사람들에 대한 아이디어를 얻으려고했습니다. 내 대답은 내 빠른 이해를 기반으로합니다. OP를 돕기 위해. 둘째, MinusFour의 게시물을보고 나면 분명히 알 수 있으며 게시물을 본 후에 Ramda 라이브러리와 point-free 함수가 더 잘 이해 된 것 같습니다. 나는 R.sum을 시도했고, 글을 편집하지 않았다. :). 어쨌든, 귀하의 의견에 다시 한 번 감사드립니다. Up votes voted, – Karpak

관련 문제