Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell型类_Haskell - Fatal编程技术网

Haskell型类

Haskell型类,haskell,Haskell,haskell类型与普通PHP类的区别 如果我禁用扩展,我可以在PHP或JavaScript中模拟类似的东西 哈斯克尔: data Person = Person { firstName :: String , lastName :: String , age :: Int , height :: Float

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})
Js:

可能存在语法错误,但请忽略它们

简而言之,如果我不使用继承,js代码与Haskell的类似


我没有模式匹配,但我可以使用“if instanceof”来检查类型

除了类型类和数据类型之间的混淆之外,您可能还需要阅读。您使用的数据类型的行为非常类似于不可变对象。那么哈斯克尔的呢

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中,这并不能保证不可变。有关详细信息,请参见在不更改原始对象的情况下合并对象特性的步骤。本文讨论了各种其他解决方案,但最后建议:

const p1 = {
    age: 35
}

const p2 = {
    ...p1,
    age: p1.age + 1
}

这不是一个类型类。。。而是
数据
类型。数据类型的行为类似于记录。关键区别之一仍然是Haskell中的数据是不可变的。Haskell中的类型类通常更接近于OO编程中的接口。标题询问类型类,而问题询问数据类型。在Haskell中,这是两个非常不同的概念,那么您要问的是哪一个?您的Haskell代码无论如何都是不正确的<代码>年龄由记录语法预定义,
p=Person“bob”“smith”34 1.7“123-4567”“?”;newage=age(p{age=35})
将更接近这个目标。如果删除PHP继承、Haskell的参数类型、PHP易变性、Haskell的多个构造函数和模式匹配、PHP方法、Haskell的更高类型等。最终您会得到一些类似的琐碎内容,但可能没有那么有趣。谢谢,但是我可以在haskell中询问我是否有data Person和Manager的年龄,例如:年龄(Person p)=p.age年龄(Manager m)=m.managerAge这是否打破了开闭原则?在允许重复字段名的haskell版本中,函数实际上需要两个参数,一个类型和一个该类型的值。通过适当的扩展,您可以显式地添加类型参数:
age@Person p
而不是
age p
(从参数
p
推断
age
的正确“版本”)。@user2693928:什么是管理者?这听起来像是将面向对象的继承混合到Haskell数据类型中。开/闭原则主要适用于OOP。如果你想知道它如何应用于函数式编程,我想你应该问一个新问题。请参阅,等等。我有不同类型的表单字段:TextField、PasswordField等。如何添加新的字段类型,如(AutocompleterField),而不破坏打开-关闭原则。我希望新字段是可插入的。将不同字段的所有代码放在一个单独的文件中,而不是在一个地方定义所有不同的实现。@user2693928在我看来,您试图在Haskell中直接应用OO原则。虽然这表面上是可行的,但它将导致单一的、坦率地说是丑陋的Haskell代码。您最好学习Haskell中使用的函数习惯用法,并使用这些原则重新思考您的设计。
const p1 = {
    age: 35
}

const p2 = {
    ...p1,
    age: p1.age + 1
}