在Haskell中创建人物

在Haskell中创建人物,haskell,Haskell,我正在尝试在Haskell中创建数据类型“Figure”,此数据类型应具有多个值: 正方形(带参数长度) 三角形(带参数长度) 圆(带参数半径) 每个图形也应该有一种颜色(比如说黑白),这就是我的代码目前的样子,但这不起作用。 有人能帮我吗 class Figure_ a where perimeter :: a -> Double area :: a -> Double data Figure = forall a. Figure_ a => Figure a

我正在尝试在Haskell中创建数据类型“Figure”,此数据类型应具有多个值:

  • 正方形(带参数长度)

  • 三角形(带参数长度)

  • 圆(带参数半径)

每个图形也应该有一种颜色(比如说黑白),这就是我的代码目前的样子,但这不起作用。 有人能帮我吗

class Figure_ a where
perimeter :: a -> Double
area      :: a -> Double

data Figure = forall a. Figure_ a => Figure a

type Radius = Double
type Side   = Double
type Color  = String

data Circle    = Circle    Radius
data Triangle  = Triangle  Side
data Square    = Square    Side


instance Figure_ Circle where
perimeter (Circle r) = 2 * pi * r
area      (Circle r) = pi * r * r

instance Figure_ Triangle where
perimeter (Triangle x y) = 2*(x + y)
area      (Triangle x y) = x * y

instance Figure_ Square where
perimeter (Square s) = 4*s
area      (Square s) = s*s

instance Figure_ Figure where
perimeter (Figure shape) = perimeter shape

对于所有的
forall
使用:

 {-# LANGUAGE ExistentialQuantification #-}
此外,三角形接受两个参数,因此应如下所示:

data Triangle  = Triangle  Side Side
class Figure_ a where
  perimeter :: a -> Double
  area      :: a -> Double
但是看看三角形的公式,我觉得你好像把它和矩形混淆了。此外,代码的缩进似乎不正确。您的代码应该如下所示:

data Triangle  = Triangle  Side Side
class Figure_ a where
  perimeter :: a -> Double
  area      :: a -> Double

创建该typeclass的实例时也应遵循相同的缩进规则。

对于
For all
使用:

 {-# LANGUAGE ExistentialQuantification #-}
此外,三角形接受两个参数,因此应如下所示:

data Triangle  = Triangle  Side Side
class Figure_ a where
  perimeter :: a -> Double
  area      :: a -> Double
但是看看三角形的公式,我觉得你好像把它和矩形混淆了。此外,代码的缩进似乎不正确。您的代码应该如下所示:

data Triangle  = Triangle  Side Side
class Figure_ a where
  perimeter :: a -> Double
  area      :: a -> Double
创建该typeclass的实例时,也应遵循相同的缩进规则

我正在尝试在Haskell中创建数据类型“Figure”,此数据类型应具有多个值:

  • 正方形(带参数长度)
  • 圆(带参数半径)
为了避免考虑几何,我省略了三角形。无论如何,这些问题听起来像是你想要的:

data Figure = Square Double | ... | Circle Double
然后您可以定义如下函数:

area :: Figure -> Double
area (Square side) = side * side
area ... = ...
area (Circle radius) = pi * radius * radius
如果只需要一个数据类型,则不需要Haskell中的类。Haskell类用于在所有类都支持公共接口时具有多个数据类型

有一个原因,您更喜欢使用
类和
for all
构建,而不是仅使用
数据的简单版本:在您的版本中,添加另一种未计划的图形更容易。如果您觉得需要这个,您可能需要阅读有关反模式的内容。但如果您只是想用Haskell来表示数字,我肯定会从一个简单的数据类型开始

我正在尝试在Haskell中创建数据类型“Figure”,此数据类型应具有多个值:

  • 正方形(带参数长度)
  • 圆(带参数半径)
为了避免考虑几何,我省略了三角形。无论如何,这些问题听起来像是你想要的:

data Figure = Square Double | ... | Circle Double
然后您可以定义如下函数:

area :: Figure -> Double
area (Square side) = side * side
area ... = ...
area (Circle radius) = pi * radius * radius
如果只需要一个数据类型,则不需要Haskell中的类。Haskell类用于在所有类都支持公共接口时具有多个数据类型


有一个原因,您更喜欢使用
类和
for all
构建,而不是仅使用
数据的简单版本:在您的版本中,添加另一种未计划的图形更容易。如果您觉得需要这个,您可能需要阅读有关反模式的内容。但是如果你只是想用Haskell来表示数字,我肯定会从一个简单的数据类型开始。

你说它不工作是什么意思?我得到了一个forall未知的错误。如果你使用的是
ghc
,它将告诉您可以使用哪个选项来克服此错误。您认为它不起作用是什么意思?我得到了forall未知的错误。如果您使用的是
ghc
,它将告诉您可以使用哪个选项来克服此错误。计算三角形的代码正确吗?还有,我如何计算边数?@user3501483不是数学论坛。要计算面积和周长,您需要获取更多参数作为输入。@user3501483要计算三角形的周长,您需要知道三角形的所有三条边,或者可以用来确定三角形的其他参数。计算三角形的代码正确吗?还有,我如何计算边数?@user3501483不是数学论坛。要计算面积和周长,您需要获取更多参数作为输入。@user3501483要计算三角形的周长,您需要知道三角形的所有三条边,或者可以用来确定三角形的其他参数。谢谢!是否有办法在“数据图”中添加长度等参数?在
data Figure=Square Double |…
中,
Double
是为所有正方形存储的参数类型。如果您想存储更多信息,只需在那里添加更多类型。例如,
data Figure=Square Double Color |…
。这就是你所说的“添加长度等参数”吗?谢谢!是否有办法在“数据图”中添加长度等参数?在
data Figure=Square Double |…
中,
Double
是为所有正方形存储的参数类型。如果您想存储更多信息,只需在那里添加更多类型。例如,
data Figure=Square Double Color |…
。这就是你所说的“添加长度等参数”吗?