Supposons que j'ai une fonction avec la signature de type:Utilisation des éléments dans une liste comme arguments
g :: a -> a -> a -> b
J'ai aussi une liste des a
s-appelons-le xs
-Que je sais que contiendra au moins trois articles. Je voudrais appliquer g
aux trois premiers articles de xs
. Je sais que je pourrais définir un combinateur comme ce qui suit:
($$$) :: (a -> a -> a -> b) -> [a] -> b
f $$$ (x:y:z:_) = f x y z
Je pouvais utiliser g $$$ xs
. Cela fait $$$
un peu comme uncurry
, mais pour une fonction avec trois arguments du même type et une liste au lieu d'un tuple. Y a-t-il un moyen de faire cela de façon idiomatique en utilisant des combinateurs standards? Ou plutôt, quelle est la manière la plus idiomatique de le faire dans Haskell? Je pensais essayer pointfree
sur une version non-infixe de $$$
pourrait me donner une idée de par où commencer, mais la sortie était une abomination avec 10 flip
s, une poignée de head
s et tail
s et ap
s, et 28 parenthèses. (NB: Je sais que ce n'est pas une chose terriblement Haskelly à faire en premier lieu, mais j'ai rencontré quelques situations où cela semble être une solution raisonnable, surtout en utilisant Parsec. certainement accepter « ne pas jamais faire dans votre code » si c'est la meilleure réponse, mais je préfère voir astuce impliquant la ((->) r)
monade ou autre.)
Je ne vois pas quel est le problème avec le code que vous avez. C'est court et précis. Tout ne doit pas (ou devrait être) sans point. – sepp2k
Je ne pense pas nécessairement qu'il y ait quelque chose qui ne va pas - je suis simplement curieux de savoir s'il existe une façon concise de le faire sans définir un nouveau combinateur comme «$$$». –
Notez qu'il s'agit d'une fonction partielle, donc ... probablement une mauvaise idée en général :) Vous pourriez être mieux avec un '($$$) :: (a -> a -> a -> b) -> [a] -> Peut-être b' –