我在打字稿中有这个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
添加具体类型,或者有更短的方法吗?
答案 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
的等效物intercalate
是Data.List
,因此我们得到:
import Data.List (intercalate)
nums = intercalate " " $ mapper show [1, 2, 3, 4]
然后console.log
就是putStrLn
,所以:
main = putStrLn nums