这是我的代码:
xandy :: Element_w_Coord Cell -> Coord
xandy (e, (x, y)) = (x, y)
transition_world :: Ordered_Lists_2D Cell -> Element_w_Coord Cell -> Ordered_Lists_2D Cell
transition_world world (cell, (x, y)) = case (cell, (x, y)) of
(Head, (x, y))-> map_Ordered_Lists_2D Tail world
(Tail, (x, y)) -> map_Ordered_Lists_2D Conductor world
(Empty, (x, y)) -> map_Ordered_Lists_2D Empty world
(Conductor, (x, y)) -> map_Ordered_Lists_2D Head world
以下是错误消息:
Sources/Transitions/For_Ordered_Lists_2D.hs:33:43:
Couldn't match expected type `Element_w_Coord e0 -> Cell'
with actual type `Cell'
In the first argument of `map_Ordered_Lists_2D', namely `Tail'
In the expression: map_Ordered_Lists_2D Tail world
In a case alternative:
(Head, (x, y)) -> map_Ordered_Lists_2D Tail world
有人喜欢告诉我我的代码有什么问题吗?
顺便说一句,这是
的定义type Ordered_Lists_2D e = [Sparse_Line e]
data Sparse_Line e = Sparse_Line {y_pos :: Y_Coord, entries :: Placed_Elements e}
data Placed_Element e = Placed_Element {x_pos :: X_Coord, entry :: e}
type Placed_Elements e = [Placed_Element e]
map_Ordered_Lists_2D :: (Element_w_Coord e -> b) -> Ordered_Lists_2D e -> Ordered_Lists_2D b
map_Ordered_Lists_2D f world = case world of
l: ls -> map_line f l: map_Ordered_Lists_2D f ls
[] -> []
where
map_line :: (Element_w_Coord e -> b) -> Sparse_Line e -> Sparse_Line b
map_line f line = Sparse_Line {y_pos = (y_pos line), entries = map_elements f (y_pos line) (entries line)}
where
map_elements :: (Element_w_Coord e -> b) -> Y_Coord -> Placed_Elements e -> Placed_Elements b
map_elements f y elements = case elements of
c: cs -> Placed_Element {x_pos = (x_pos c), entry = f ((entry c), ((x_pos c), y))}: map_elements f y cs
[] -> []
感谢所有能为我提供建议的人XD
答案 0 :(得分:1)
map_Ordered_Lists_2D
的第一个参数应该是一个函数,但是你传递的是Tail
,它的类型为Cell
。
以下将进行类型检查,并应作为起点帮助您:
transition_world world (cell, (x, y)) = case (cell, (x, y)) of
(Head, (x, y))-> map_Ordered_Lists_2D (const Tail) world
(Tail, (x, y)) -> map_Ordered_Lists_2D (const Conductor) world
(Empty, (x, y)) -> map_Ordered_Lists_2D (const Empty) world
(Conductor, (x, y)) -> map_Ordered_Lists_2D (const Head) world
(函数const
接受一个值并将其转换为一个函数,该函数始终返回相同的值,无论其参数如何。)
答案 1 :(得分:1)
首先尝试使函数变小,例如:
xandy :: Element_w_Coord Cell -> Coord
xandy (_, coord) = coord
transition_world :: Ordered_Lists_2D Cell -> Element_w_Coord Cell -> Ordered_Lists_2D Cell
transition_world world (cell, _) = map_Ordered_Lists_2D (transition_cell cell) world
where
transition_cell :: Cell -> Cell
transition_cell cell
| Head = Tail
| Tail = Conductor
| Empty = Empty
| Conductor = Head
和
map_Ordered_Lists_2D :: (Element_w_Coord e -> b) -> Ordered_Lists_2D e -> Ordered_Lists_2D b
map_Ordered_Lists_2D f world = map (map_line f) world
where
map_line :: (Element_w_Coord e -> b) -> Sparse_Line e -> Sparse_Line b
map_line f line = Sparse_Line {y_pos = y_pos line, entries = map_elements f (y_pos line) (entries line)}
map_elements :: (Element_w_Coord e -> b) -> Y_Coord -> Placed_Elements e -> Placed_Elements b
map_elements f y elements = let
place_e c = Placed_Element {x_pos = x_pos c, entry = f (entry c, (x_pos c, y))}
in
map place_e elements