haskell类型与常规PHP类的不同之处。
如果我禁用扩展,我可以在PHP或JavaScript中模拟类似的东西。
Haskell中:
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})
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
可能存在语法错误但忽略它们。
简而言之,如果我不使用继承,则js代码与Haskell类似。
我没有模式匹配,但我可以使用“if instanceof”来检查类型。
答案 0 :(得分:6)
除了类型和数据类型之间的混淆之外,您可能还想阅读OOP vs. Haskell type classes。您使用的数据类型的行为与不可变对象非常相似。所以哈斯克尔的
data Person = Person { age :: Int }
p1, p2 :: Person
p1 = Person { age = 35 }
p2 = p1 { age = age p1 + 1 }
可能用ES6编写,如
class Person {
constructor(age) {
this.age = age;
}
}
p1 = new Person(35);
p2 = new Person(p1.age + 1);
但在ES6中,这并不能保证不会产生不变性。为此,请参阅the const
and ...
keywords以合并对象的属性而不更改原始对象。本文讨论了其他各种解决方案,但最终建议:
const p1 = {
age: 35
}
const p2 = {
...p1,
age: p1.age + 1
}