// rollup.config.js
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
external: [/node_modules/],
input: {
core: 'src/core',
all: 'src/all',
},
output: {
dir: 'dist',
format: 'cjs',
entryFileNames: '[name].js',
},
plugins: [commonjs(), nodeResolve()],
};
vectors :: Int -> [[Int]]
vectors n = replicateM n [0, 1]
data BinTree = Leaf [Int] | Node BinTree BinTree deriving Show
vars :: Int -> [Int] -> BinTree
vars 1 context = Node (Leaf (0:context)) (Leaf (1:context))
vars n context = Node (vars (n-1) (0:context)) (vars (n-1) (1:context))
Prelude> vars 2 []
Node (Node (Leaf [0,0]) (Leaf [1,0])) (Node (Leaf [0,1]) (Leaf [1,1]))
сравнить две даты [...] отнимать текущую дату - и получаю разницу в днях. И эта разница должна быть не более чем 16 То есть дата от пользователя должна быть не раньше текущей (чтобы не улететь в прошлое), но не позже чем "текущая + 16 дней"
-- количество дней (но не меньше 0 и не больше 16) от сего дня (today) до указанного дня (day)
-- возвращаемое число лежит в интервале [0, 16]
strippedDayDiff :: Day -> Day -> Integer
strippedDayDiff day today = let d = diffDays day today in if d > 16 then 16 else if d < 0 then 0 else d
if strippedDayDiff forecastDay (utctDay currentTime) >= ...
diffDaysIn0_16 day today = let d = diffDays day today in 0 <= d && d <= 16
git branch -f master HEAD
g.bind(t, x)
условно эквивалентноfunction (a) {
return g.call(t, x, a);
}
Function.apply
не то же самое, что Function.prototype.apply
. Но в рассматриваемом случае, как мы увидим, они взаимозаменяемы, потому что их значения совпадают (указывают на одну функцию с одним кодом).Function.apply.bind(f, null)
возвращает функцию, грубо говоря (потому что неявно предполагается, что эта функция в будущем будет вызвана ровно с одним аргументом), такого видаfunction (a) {
return Function.apply.call(f, null, a);
}
что условно (потому что здесь происходит изменение f
как объекта; в действительности, вызывается apply
с this=f
) эквивалентноfunction (a) {
f.apply = Function.apply;
return f.apply(null, a);
}
Поскольку функция f при нормальных обстоятельствах наследует тот же apply, что и Function, Function.apply.apply(f, null, a)
полностью эквивалентно f.apply(null, a)
.function (a) {
return f.apply(a);
}
то есть a
будет передано как this
.function foo(bar,baz) {
var x = bar * baz;
return [
Promise.resolve(x),
Promise.resolve(x*2 )
];
}
Promise.all(
foo( 10, 20 )
)
.then( Function.apply.bind(
function() {
console.log( this[0], this[1] );
}
) );
А есть ли смысл указывать для дочернего объекта конструктор прототипа, я так понимаю это только ссылка на функцию, и если его необязательно использовать?У каждого конструктора есть прототип. По умолчанию это Object.prototype.
Как лучше всего добавлять в прототип свои свойстваЯ не знаю. ИМХО, для прикладных задач лучше делать так, чтоб читало проще.
Как лучше добавлять свои методы, вариант только так, или есть более элегантное решение, например создать объект со своими методами и склеить его с прототипом?Без разницы, но нужно учитывать один момент.
Unhandled Error: String.prototype.toString: this is not a String object
String.prototype.toString = function() {
if (typeof this === 'string')
return this.valueOf();
else
throw new TypeError();
};
`Pr`pB[d]
End[]
.BeginPackage["P`"];
b::usage = "My b var";
Begin["`Pr`"];
a = 2;
b := a;
End[];
EndPackage[];
In[9]:= OwnValues[b]
Out[9]= {HoldPattern[b] :> P`Pr`a}
substitute x y [] = ...
substitute x y (h:hs) = ...
является краткой формой записи (кстати, "упрощенный" Хаскель, к которому ghc приводит код перед компиляцией, как раз такое представление использует)substitute x y z = case z of
[] -> ...
(h:hs) -> ...
или, если гиперболизировать,substitute x y z = if null z then ... else let h = head z; hs = tail z in ...
func x x = ...
, когда x :: a -> b
?