【发布时间】:2016-11-26 19:32:48
【问题描述】:
我正在尝试以成对的方式将两个多态元组添加在一起。 (一个元组中的第一个元素的类型应该与第二个中的第一个元素的类型相同,第二个元素的类型也一样) 这是我的代码:
module Main where
class Coordinate a where
createCoordinate :: a
getFirst :: (a,b) -> a
getSecond :: (a,b) -> b
addCoordinates :: (a,b) -> (a,b) -> (a,b)
instance Coordinate () where
createCoordinate = ()
getFirst (a,b) = a
getSecond (a,b) = b
addCoordinates a b = (getFirst a + getFirst b, getSecond a + getSecond b)
所以,问题在于我的 addCoordinates 函数。我想知道是否有人可以为我提供有关如何实现该功能的任何帮助。 谢谢! :)
【问题讨论】:
-
是的,我对 Haskell 很陌生。我以前的编程经验是使用 Java。有什么具体的我可以为你澄清一下吗?
-
为什么所有类的函数都在元组而不是坐标上工作?您的大多数方法都具有
b类型变量的目的是什么-例如为什么要使用第一个元素是坐标而第二个元素是任意元素的元组?单位值作为坐标有什么意义? -
我不认为你想要
class这里。您不想让任意类型表现为坐标。您需要一个包含一对值的数据类型。 -
你不使用类型类来建模数据,所以你开始使用完全错误的任务来学习类。如果这是您的主要目标,那么放弃并寻找不同的锻炼方式会更好地为您服务。 Haskell 中的类与 OO 语言中的类不同,它们更类似于 OO 接口。您使用数据类型对数据进行建模。类用于对许多不同类型可能想要实现的抽象接口进行建模(每个都以自己独特的方式)。
-
在您有足够的使用其他人定义的类的经验之前,您不应该开始定义自己的类。 Haskell 程序员通常会定义大量的数据类型,而我们往往对类更加克制。制作一个没有捕捉到真正抽象的“用于实践”可能没有那么有帮助。练习使用
Show、Read、Ord、Functor、Applicative、Monad、Traversable、Monoid、Category等并编写实例。然后尝试制定表示涉及一个或多个操作的特定概念的类。试着写一个Ring类,比如说。
标签: haskell