11
votes

Utilisation pratique de K-Combinator (Kestrel) en JavaScript

Le k-Combinateur peut être implémenté comme ci-dessous et la mise en œuvre ne doit pas avoir d'effets secondaires.

const K = x => y => x;


3 commentaires

CS.StaCKExchange.com/Questions/55441/...


Il ressemble à la fonction CL Constanty qui est parfois utile parfois.


Dans les langues au curry, vous l'utiliseriez chaque fois que vous souhaitez qu'un rappel ignore le premier argument.


3 Réponses :


4
votes

Le problème avec K code> comme avec tous les combinateurs primitifs est que vous ne pouvez pas le considérer lui-même. combinators primitives sont les éléments fondamentaux de la programmation fonctionnelle. Vous avez besoin d'un contexte pour les regarder au travail. Le défi est de assimilez ce contexte, si vous êtes nouveau paradigme fonctionnel

Voici un « contexte typique »:. Option code>. Les instances du Option code> type sont comme des valeurs qui peuvent être null code>, mais jamais jeter une erreur lorsqu'il est appliqué à une fonction: p>

p>

f => o => Option.fold(x => Option.of(f(x))) (K(o)) (o)


1 commentaires

Où est la fonction de condition préalable "précon"?



1
votes

k Combinateur peut également être utilisé comme valeur de vérité, lors de l'utilisation de booléens codés à l'église. C'est à dire. SI-Test alors d'autre: si votre "si-test" renvoie K, alors "sinon" serait supprimé et "alors" serait exécuté.


0 commentaires

6
votes

sorte d'une question large, mais c'est bien, je l'aime bien.

Pour soutenir mon exemple, je vais mettre en œuvre ... P>

// 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,1,2,3,4]

console.log(abuild (5) (x=> x * x))
// => [0,1,4,9,16]

console.log(abuild (5) (K('ha')))
// => ['ha','ha','ha','ha','ha']


3 commentaires

J'aime les fonctions avec l'humour: D est k ("ha") rire avec ou à propos de quelqu'un ?!


C'est seulement un peu de perspicacité en moi! J'aime faire la lumière de toute situation ^ _ ^


Mais comment générer ["ha", "ha", "ha"] utile?