我正在处理Haskell中的代数类型,并在工作表中进行一些练习。我进行了以下练习:
- 定义代数类型Point,以表示二维空间中的点(的坐标)。
我的练习代码:
data Point = Point Float Float
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
- 使用Point定义Shape数据类型的修改版本PositionedShape,其中包括形状的中心以及尺寸。
先前定义的形状数据:
data Shape = Circle Float |
Rectangle Float Float
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我的练习代码:
data PositionedShape = PositionedShape Shape Point
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
现在我的问题出现在这个问题中:
定义一个函数:
haskell move :: PositionedShape -> Float -> Float -> PositionedShape将形状移动给定的x和y距离
我对此的实现如下:
move :: PositionedShape -> Float -> Float -> PositionedShape
move (Shape (Point x y)) newX newY = Shape (Point newX newY)
Run Code Online (Sandbox Code Playgroud)
这将返回此错误:
Week8.hs:103:7:错误:不在范围内:数据构造函数'Shape'失败,模块已加载:无。
有人可以向我解释为什么这个错误,我该如何解决?我对代数类型有些困惑,我尝试了很多事情,但似乎无法解决。
基本上我有这个练习:回忆一下上周的StudentMark类型同义词.写一个递归函数:
listMarks :: String -> [StudentMark] -> [Int]
Run Code Online (Sandbox Code Playgroud)
它给出了特定学生的分数列表; 例如:
listMarks "Joe" [("Joe", 45), ("Sam", 70), ("Joe", 52)] = [45,52]
Run Code Online (Sandbox Code Playgroud)
这就是我编写函数的方式:
type StudentMark = (String, Int)
listMarks :: String -> [StudentMark] -> [Int]
listMarks _ [] = []
listMarks std (x:xs)
| std == fst x = snd x : listMarks (fst x) xs
| otherwise = listMarks (fst x) xs
Run Code Online (Sandbox Code Playgroud)
如果列表中的字符串与"std"字符串不同,则不起作用.我想了解为什么以及如何才能完成这项工作?谢谢!
基本上我有这个练习:使用列表推导,写一个多态函数:
split :: [(a, b)] -> ([a], [b])
Run Code Online (Sandbox Code Playgroud)
它将一对(任何类型的)列表转换为一对列表.例如,
split [(1, 'a'), (2, 'b'), (3, 'c')] = ([1, 2, 3], "abc")
Run Code Online (Sandbox Code Playgroud)
这是我编写函数的方式,但它不起作用:
split :: [(a, b)] -> ([a], [b])
split listOfPairs = (([a | a <- listOfPairs]), ([b | b <- listOfPairs]))
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我的解决方案不起作用?谢谢!