K组合器可以实现如下,实现不应有任何副作用.
const K = x => y => x;
它有时被称为“const”(如在Haskell中). K函数可以被定义为:“取一个值并返回总是返回该值的(常数)一元函数.
什么时候有用?请帮助我实际的例子.
解决方法
排序一个广泛的问题,但它很好,我喜欢它.
为了支持我的例子,在这个答案我将要实施…
abuild :: Number -> (Number -> a) -> [a]
…根据类型建议,需要一个数字和一个函数来构建一个数组.如果您希望基于某些计算来构建已知大小的数组,这可能很有用.
我们来构建一个包含5个元素的数组,使用identity function id.如您所见,您的构建器功能将给出以0开头的连续数字索引
abuild(5)(id)
// => [0,1,2,3,4]
我们这次和建筑师做一些情感.我们将平方的输入.非常先进
abuild (5) (x=> x * x) // => [0,4,9,16]
或者也许我们不关心输入.我总是喜欢笑我不断地笑起来可以说我K(‘哈’)…
abuild (5) (K('ha')) // => ['ha','ha','ha']
激动!很有用,对吧?那是K
履行
继续运行,看看K在行动!
// id :: a -> a const id = x=> x // K :: a -> b -> a const K = x=> y=> x // add :: Number -> Number -> Number const add = x=> y=> y + x // reduce :: (a -> b) -> b -> [a] -> b const reduce = f=> y=> ([x,...xs])=> { if (x === undefined) return y else return reduce (f) (f (y) (x)) (xs) } // map :: (a -> b) -> [a] -> [b] const map = f=> reduce (xs=> x=> [...xs,f(x)]) ([]) // iterate :: Number -> (a -> a) -> a -> [a] const iterate = n=> f=> x=> n > 0 ? [x,...iterate (n - 1) (f) (f(x))] : [] // abuild :: Number -> (Number -> a) -> [a] const abuild = n=> f=> map (f) (iterate (n) (add (1)) (0)) console.log(abuild (5) (id)) // => [0,4] console.log(abuild (5) (x=> x * x)) // => [0,16] console.log(abuild (5) (K('ha'))) // => ['ha','ha']