Haskell类型类

时间:2018-04-23 14:30:36

标签: haskell

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”来检查类型。

1 个答案:

答案 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
}