Domanda

Quale dei seguenti sei più probabilità di scrittura?

r = zip xs $ map sqrt xs

o

r = [(x, sqrt x) | x <- xs]

Il codice di esempio su Internet sembra indicare che il primo è più abbondante e il modo preferito.

È stato utile?

Soluzione

mi piacerebbe probabilmente scrittura

map (\x -> (x, sqrt x)) xs

Se si preferisce senza punti, quanto sopra è equivalente a (dopo aver importato Control.Monad e Control.Monad.Instances)

map (ap (,) sqrt) xs

Un'altra alternativa che non è ancora stato menzionato è

zipWith (,) xs (map sqrt xs)

Altri suggerimenti

Le persone che trascorrono troppo tempo in #haskell sarebbe probabilmente scrivere che come

r = map (id &&& sqrt) xs

(&&&) è un combinatore divertente definito Control.Arrow. La sua firma tipo effettivo è complicato perché è generalizzata a tutte le istanze di Arrow. Ma è spesso usato con l'istanza di (->) Arrow, che si traduce in questa firma tipo:

(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c)

Anche se tendo a non usarli per molto spesso, in questo caso, credo che preferirei la versione di lista, dal momento che sembra più pulito per me.

Se siete in free style punto, come si potrebbe anche questa:

f = zip `ap` map sqrt

vite AP in Control.Monad e in questo caso, può essere pensato come la Combinator S, che generalizza applicazione SCI calcolo :

ap f g x == f x (g x)
ap const const == id

Come Conal sottolinea, questo può anche essere generalizzata da Monade a questa convenzione applicativa (importazione Control.Applicative):

f = zip <*> map sqrt

Vorrei map probabilmente scrittura / zip e poi Wish avevo scritto la lista di comprensione.

Per alcuni tipi di problemi ( Project Euler in particolare), questo caso particolare arriva così spesso che ho scritto il seguente piccolo aiutante:

with :: (a -> b) -> a -> (a,b)
with f a = (a, f a)

In questo modo il vostro esempio da scrivere:

r = map (with sqrt) xs

Io sono più di un "Old School" Haskellier, quindi mi piacerebbe utilizzare zip `ap` map sqrt e successivamente refactoring di utilizzare la <*> invece di ap.

applicativo è il nuovo Monade. (Nel senso di "cosa Cool Haskell bambini utilizzano in questi giorni?")

Io uso raramente list comprehension, ma entrambi sono da dandy. Basta usare quello che rende il codice più facile da leggere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top