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添加具体类型还是有更短的方法?
您的第一行是类型别名,该别名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.log是putStrLn,所以:
main = putStrLn nums
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |