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
Class 在Haskell中,可以创建类的对象吗?_Class_Haskell_Types - Fatal编程技术网

Class 在Haskell中,可以创建类的对象吗?

Class 在Haskell中,可以创建类的对象吗?,class,haskell,types,Class,Haskell,Types,在我试图调试的Haskell程序中,定义了一个类: class Dictionary d where lookupIn :: d -> Word -> String 我想创建一个名为runs的变量,并将其设置为Dictionary类型,以便在lookupIn函数中使用它。然而,一切都不起作用。我尝试过type runs=Dictionary,甚至data runs=Dictionary,但都没有效果。Haskell不是一种面向对象的语言。Typeclass不是类。变量不是“变量

在我试图调试的Haskell程序中,定义了一个类:

class Dictionary d where
  lookupIn :: d -> Word -> String

我想创建一个名为
runs
的变量,并将其设置为
Dictionary
类型,以便在lookupIn函数中使用它。然而,一切都不起作用。我尝试过
type runs=Dictionary
,甚至
data runs=Dictionary
,但都没有效果。

Haskell不是一种面向对象的语言。Typeclass不是类。变量不是“变量”(虽然这在这里无关紧要),当然也不是对象

看这个


还有,我想这是家庭作业。试着先学习这门语言(哪怕是一点点),哈斯凯尔很可能比你想象的更有趣。

在哈斯凯尔,这是不可能的。在其他具有类类型构造的语言中(Scala、Agda),这是可能的,但在Haskell中是不可能的

可以在Haskell中创建类的实例:

instance Dictionary () where
    lookupIn _ _ = "no"
然后使用它:

main = do
    putStrLn $ lookupIn () "hello"
事实上,实例的行为非常类似于数据——它们在运行时由数据表示。这就是为什么在其他语言中可以将实例存储在变量中,并显式地传递它们

但是,在Haskell中,无法命名实例或将其存储在变量中。也就是说,你不能这样做,或者做类似的事情:

thisInstance :: Dictionary ()
thisInstance = ???
原因是在Haskell中,假设对于每个类型和typeclass,只能有一个应用于该类型的typeclass实例。也就是说,您只能定义一个
实例字典()
。因为只能有一个,所以没有必要给它命名。这对于Haskell的类型推断很方便——任何需要的实例都可以被拉到当前函数的“参数”(真正的类型类约束)中


当然,也有可能实现相同的行为,只是TypeClass不行——记录可以很好地实现这一点:

data DictionaryType d = DictionaryData { lookupIn :: d -> Word -> String }
现在,
lookupIn
具有类型
DictionaryType d->d->Word->String
,这是使用类型
(Dictionary d)=>d->Word->String
对typeclass的直译。您可以这样使用它:

myDictionary :: DictionaryType ()
myDictionary = DictionaryData (\_ _ -> "no")

main = do
    putStrLn $ lookupIn myDictionary () "hello"

在功能上与typeclass解决方案相同,唯一的区别在于语法和类型检查的工作方式。

考虑它的一种方式是:

在OO语言中,类定义了一个类型(即一组潜在值)和一组其他类型(即潜在的后代类)

在Haskell中,typeclass只定义一组类型(即typeclass的潜在“实例”)。typeclass本身不是类型


(事实上,我正在讨论一个集合和一个类之间的界限,这就是为什么它们被称为“typeclasses”而不是“Types”。但这在这里并不重要。)

@Downvoter,请帮我解释一下你为什么投了否决票。感谢您在最后一部分中尝试实现类行为,字典是函数吗???
Dictionary
代表两种不同的东西。。。类型构造函数和数据构造函数。数据构造函数是一种函数——它们获取数据字段并从中构建对象。我将编辑这些名称以使区别更清楚。我一直在努力学习,但我仍然没有完全掌握课堂是如何运作的。不过,这一点已经开始深入人心了。是的,我发现哈斯克尔很有趣!Haskell类型的类肯定是一个类!它是一个数学意义上的“不完全是一个集合”或“由谓词定义”的类(类型)。。。好吧,我是个糟糕的专家,不是吗?