Haskell类型类

use*_*928 -2 haskell

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"来检查类型.

Sim*_*ine 6

除了类型类和数据类型之间的混淆之外,您可能希望阅读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)

  • 在允许重复字段名称的Haskell版本中,该函数实际上采用*two*参数,该类型的类型和值.通过适当的扩展,您可以明确地添加类型参数:`age @Person p`而不是`age p`(从参数`p`推断出`age`的正确"版本"). (2认同)