Tengo esta Mapper función a máquina de escribir

type Mapper<TSource, TDestination> = (fn: (source: TSource) => TDestination, source: TSource[]) => TDestination[];

const mapper: Mapper<number, string> = (fn: (a: number) => string, source: number[]): string[] => {
  return source.map(n => fn(n));
}

const nums = mapper(n => n.toString(), [1,2,3, 4]).join(" ");

console.log(nums);

Estoy leyendo sobre Haskell en este momento y me pregunto cómo haría esto en Haskell.

He encontrado esta definición de tipo en Google:

map :: (a -> b) -> [a] -> [b]

¿Necesitaría usar instance para agregar tipos de concreto o hay una manera más corta?

0
dagda1 14 jul. 2019 a las 20:29

1 respuesta

La mejor respuesta

Su primera línea es un alias de tipo que le da el nombre Mapper al tipo de map. En Haskell que sería:

type Mapper a b = (a -> b) -> [a] -> [b]

Luego, usted define una función llamada mapper que es equivalente a map. En Haskell, eso es mapper = map, pero también puede agregar la firma de tipo en frente:

mapper :: Mapper a b
mapper = map

Por supuesto, la función mapper no sirve realmente ningún propósito aquí y podríamos también haber usado map directamente, pero eso ya era cierto en el código de Typescript original.

El equivalente Haskell de n => n.toString() es show y el equivalente de join es intercalate de Data.List, así que obtenemos:

import Data.List (intercalate)

nums = intercalate " " $ mapper show [1, 2, 3, 4]

Y luego console.log es solo putStrLn, así que:

main = putStrLn nums
5
sepp2k 14 jul. 2019 a las 17:46