haskell相当于打字稿映射功能

dag*_*da1 0 haskell typescript

我在打字稿中有这个Mapper函数

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);
Run Code Online (Sandbox Code Playgroud)

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

我在hoogle中发现了此类型定义:

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

我需要使用instance添加具体类型还是有更短的方法?

sep*_*p2k 5

您的第一行是类型别名,该别名Mapper为的类型map。在Haskell中将是:

type Mapper a b = (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

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

mapper :: Mapper a b
mapper = map
Run Code Online (Sandbox Code Playgroud)

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

n => n.toString()is 等效的Haskell show和与from 等效的joinis ,因此我们得到:intercalateData.List

import Data.List (intercalate)

nums = intercalate " " $ mapper show [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

然后console.logputStrLn,所以:

main = putStrLn nums
Run Code Online (Sandbox Code Playgroud)