haskell相当于打字稿映射功能

时间:2019-07-14 17:29:45

标签: typescript haskell

我在打字稿中有这个Mapper function

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);

我目前正在阅读有关haskell的文章,想知道我将如何在haskell中做到这一点。

我在呼啸中找到了这个类型定义:

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

我是否需要使用instance添加具体类型,或者有更短的方法吗?

1 个答案:

答案 0 :(得分:5)

第一行是类型别名,将名称Mapper赋予map类型。在Haskell中应该是:

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

然后,您定义一个名为mapper的函数,该函数等效于map。在Haskell中为mapper = map,但您也可以在前面添加类型签名:

mapper :: Mapper a b
mapper = map

当然,mapper函数在这里并没有真正的作用,我们也可以直接使用map,但这已经适用于原始TypeScript代码。

n => n.toString()的{​​{1}}的Haskell等价物是show,而join的等效物intercalateData.List,因此我们得到:

import Data.List (intercalate)

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

然后console.log就是putStrLn,所以:

main = putStrLn nums