3

Как преобразовать следующую простую функцию average в бесстольную форму (используя Ramda)?Как преобразовать простую среднюю функцию в javascript в свободную форму с помощью Ramda?

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

Спасибо, что подняли замечательный момент относительно удобочитаемости. И определенно хорошо помнить, что _ «Если стиль без точек нелегко записать, то, возможно, также не так легко читать» 0. Но как упражнение, как бы вы ответили на вопрос, если бы вы _had_ , – Chad

+0

Я честно не знаю, и это похоже на головную боль. :) – Xotic750

ответ

6

Использование R.converge:

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

Использование R.lift (что более обычно применяется функция, чем R.converge):

// 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: «Проголосовали». – 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 отображает значения массива в R.sum и R.length, который дает вам массив с суммой массива и длиной массива. Результат применяется к R.divide.

+0

Именно поэтому 'pointfree' также известен как' бессмысленный'? Просто шучу, но это выглядит очень болезненно для меня. :) – Xotic750

+0

Мне понадобилось время, чтобы понять это, но я думаю, что это не так уж плохо. Я просто не привык к этому. Нотация Infix тоже не очень помогает. – MinusFour

+0

Вверх проголосовали. Я чувствую, что это идеальный беспроблемный солн. Солон, который я предоставил, основан на том, что написал OP. – Karpak

0

Вы можете попробовать ниже одного

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

Это гораздо менее болезненно на моей голове. Я предполагаю, что они отвечают требованиям OP, поскольку я не очень хорошо знаком с 'pointfree'? – Xotic750

+2

Ваша функция '_sum' лучше написана' R.reduce (R.add, 0) '- нет необходимости в функции обертывания. Кроме того, вы можете просто использовать ['R.sum'] (http://ramdajs.com/0.22.1/docs/#sum). ;) – davidchambers

+0

Большое спасибо davidchambers, за ваши отзывы. Я слышал о библиотеке Рамды и бесплатных функциях с точками только после просмотра сообщения OP. Просто попытался немного задуматься о тех, кто быстро ответил на этот пост и что-то получил. Мой ответ основан на моем быстром понимании. просто чтобы помочь ОП. Во-вторых, после просмотра сообщения MinusFour появилась определенная ясность, и, увидев ваш пост, я чувствую, что теперь я понял библиотеку Ramda и функции без точек. Я пробовал R.sum и не редактировал сообщение. :). В любом случае, еще раз спасибо за ваши отзывы. Вверх проголосовали, – Karpak

Смежные вопросы