haskell类型与常规PHP类的不同之处.
如果我禁用扩展,我可以在PHP或JavaScript中模拟类似的东西.
哈斯克尔:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
, height :: Float
, phoneNumber :: String
, flavor :: String
age :: Person -> Int
age (Person p) = p.age
newAge = age(Person {age:=35})
Run Code Online (Sandbox Code Playgroud)
JS:
class Person {
constructor(data) {
this.data = data
}
}
function age(p) {
if (p instanceof Person) return p.age
}
let personAge = age(new Person({age: 35})); // 35
Run Code Online (Sandbox Code Playgroud)
可能存在语法错误但忽略它们.
简而言之,如果我不使用继承,js代码类似于Haskell.
我没有模式匹配,但我可以使用"if instanceof"来检查类型.
除了类型类和数据类型之间的混淆之外,您可能希望阅读OOP与Haskell类型类.您使用的数据类型的行为与不可变对象非常相似.所以Haskell的
data Person = Person { age :: Int }
p1, p2 :: Person
p1 = Person { age = 35 }
p2 = p1 { age = age p1 + 1 }
Run Code Online (Sandbox Code Playgroud)
可能是用ES6编写的
class Person {
constructor(age) {
this.age = age;
}
}
p1 = new Person(35);
p2 = new Person(p1.age + 1);
Run Code Online (Sandbox Code Playgroud)
但是,在ES6中,这并不能保证不会产生不变性.对于这一点,看到的const和...关键字为合并对象的属性,而无需改变原有的对象.本文讨论了各种其他解决方案,但最终建议:
const p1 = {
age: 35
}
const p2 = {
...p1,
age: p1.age + 1
}
Run Code Online (Sandbox Code Playgroud)