Swift is like Haskell

前言

Swift是一门多泛式语言,而且参考了很多其它语言的实现,所以总能在不同语言里看到一些Swift的影子。

前段时间看到一篇文章,Swift is like Scala,里面做了Swift和Scala一些语法的对比,有些代码块语法上是很像的。最近又看到了Swift is like KotlinSwift is like Go。感觉这些挺有趣的,最近刚好有了解一点Haskell,所以就有了这个想法来对比下相似点。

这儿只是列出两门语言一些类似的点,或语法,或概念上的。但在真正使用的时候,差别还是巨大的。如果想了解真正的工程中,Haskell的使用,可以参考下 Github Haskell Star排名

对比


Hello World

Swift

1
print("Hello, world!")

Haskell

1
putStrLn "hello, world!"

变量定义

Swift

1
2
let a = 1
var m = 2

Haskell

1
2
-- haskell中没有var定义,只能定义不可修改的变量
let a = 1

显示指定类型

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
2
3
func process(_ a: Int, _ b: Int) -> (Int, Int) {
return (a + b, a * b)
}

Haskell

1
process a b = (a + b, a * b)

操作符另外的调用方式

Swift

1
(+)(1, 2)	// 输出3

Haskell

1
(+) 1 2

自定义操作符

Swift

1
2
3
infix operator <^> : AdditionPrecedence
func <^>(lhs: Int, rhs: Int) -> Int { return lhs + rhs }
5 <^> 6 // 11

Haskell

1
2
3
(<^>) :: Int -> Int -> Int
a <^> b = a + b
5 <^> 6 -- 11

Map

Swift

1
[1, 2, 3].map { $0 * 2}		// [2, 4, 6]

Haskell

1
map (*2) [1, 2, 3]		-- [2, 4, 6]

数据类型

Swift

1
2
3
4
public struct CGPoint {
public var x: CGFloat
public var y: CGFloat
}

Haskell

1
2
data Point = Point Double Double
deriving (Show)

枚举类型

Swift

1
2
3
4
enum Shape {
case circle(CGPoint, CGFloat)
case rectangle(CGPoint, CGFloat, CGFloat)
}

Haskell

1
2
3
data Shape = Circle Point Double
| Rectangle Point Double Double
deriving (Show)

模式匹配

Swift

1
2
3
4
5
6
7
let e = Shape.circle(CGPoint(x: 0, y: 0), 100)
switch e {
case let .circle(pt, _):
// code
case let .rectangle(pt, _, _):
// code
}

Haskell

1
2
3
shapeInfo :: Shape -> String
shapeInfo (Circle pt _) = "Circle point" ++ show pt
shapeInfo (Rectangle pt _ _) = "Rectangle point" ++ show pt

参考资料

Real World Haskell 中文版