前言
Swift是一门多泛式语言,而且参考了很多其它语言的实现,所以总能在不同语言里看到一些Swift的影子。
前段时间看到一篇文章,Swift is like Scala,里面做了Swift和Scala一些语法的对比,有些代码块语法上是很像的。最近又看到了Swift is like Kotlin,Swift is like Go。感觉这些挺有趣的,最近刚好有了解一点Haskell,所以就有了这个想法来对比下相似点。
这儿只是列出两门语言一些类似的点,或语法,或概念上的。但在真正使用的时候,差别还是巨大的。如果想了解真正的工程中,Haskell的使用,可以参考下 Github Haskell Star排名等
对比
Hello World
Swift
1 | print("Hello, world!") |
Haskell
1 | putStrLn "hello, world!" |
变量定义
Swift
1 | let a = 1 |
Haskell
1 | -- haskell中没有var定义,只能定义不可修改的变量 |
显示指定类型
Swift
1 | let a: Float = 5 |
Haskell
1 | let a = 5 :: Float |
字符串连接
Swift
1 | let ret = "111" + "222" |
Haskell
1 | let ret = "111" ++ "222" |
数组定义
Swift
1 | let lst = ["1", "2", "3"] |
Haskell
1 | let lst = ["1", "2", "3"] |
区间
Swift
1 | let lst = [1 ... 5] |
Haskell
1 | let lst = [1 .. 5] -- [1, 2, 3, 4, 5] |
函数定义
Swift
1 | func myAdd(_ a: Int, _ b: Int) -> Int { return a + b } |
Haskell
1 | myAdd a b = a + b |
泛型函数
Swift
1 | func myAdd<T: Numeric>(_ a: T, _ b: T) -> T { return a + b } |
Haskell
1 | myAdd a b = a + b |
返回元组
Swift
1 | func process(_ a: Int, _ b: Int) -> (Int, Int) { |
Haskell
1 | process a b = (a + b, a * b) |
操作符另外的调用方式
Swift
1 | (+)(1, 2) // 输出3 |
Haskell
1 | (+) 1 2 |
自定义操作符
Swift
1 | infix operator <^> : AdditionPrecedence |
Haskell
1 | (<^>) :: Int -> Int -> Int |
Map
Swift
1 | [1, 2, 3].map { $0 * 2} // [2, 4, 6] |
Haskell
1 | map (*2) [1, 2, 3] -- [2, 4, 6] |
数据类型
Swift
1 | public struct CGPoint { |
Haskell
1 | data Point = Point Double Double |
枚举类型
Swift
1 | enum Shape { |
Haskell
1 | data Shape = Circle Point Double |
模式匹配
Swift
1 | let e = Shape.circle(CGPoint(x: 0, y: 0), 100) |
Haskell
1 | shapeInfo :: Shape -> String |