List 在函数中创建新列表并向其中添加元素

List 在函数中创建新列表并向其中添加元素,list,haskell,List,Haskell,我试图创建一个函数,它取一个坐标,然后给定一组坐标,它提取出给定坐标一个单位内的所有坐标,然后列出一个列表。我已经知道如何使这个功能,我只需要澄清我如何使它返回新的列表 例如,如果我给函数(2,1)[(1,3)、(1,2)、(3,0)、(4,2)、(2,2)、(3,1)],它将返回一个列表[(1,2)、(3,0)、(2,2)、(3,1)] 我已经知道如何实现一个函数,可以发现一个列表是否在一个单元内,我只需要知道如何获取匹配我的模式的函数,并将其返回到一个新的列表中 local_elements

我试图创建一个函数,它取一个坐标,然后给定一组坐标,它提取出给定坐标一个单位内的所有坐标,然后列出一个列表。我已经知道如何使这个功能,我只需要澄清我如何使它返回新的列表

例如,如果我给函数
(2,1)[(1,3)、(1,2)、(3,0)、(4,2)、(2,2)、(3,1)]
,它将返回一个列表
[(1,2)、(3,0)、(2,2)、(3,1)]

我已经知道如何实现一个函数,可以发现一个列表是否在一个单元内,我只需要知道如何获取匹配我的模式的函数,并将其返回到一个新的列表中

local_elements :: Coordinate -> List_with_coordinates -> List_with_coordinates
local_elements (x_c,y_c) list = case list of
  (x_l,y_l) :xs
    | abs (x_l - x_c) <= 1 && abs (y_l - y_c) <=1 -> "what would go here?" local_elements xs
    | otherwise -> local_elements xs        
  [] -> []
local\u元素::坐标->用坐标列出\u->用坐标列出\u
局部元素(x_c,y_c)列表=实例列表
(x_l,y_l):xs
|abs(x_l-x_c)局部元素xs
[] -> []
您创建了一个函数

dist :: Int -> Coordinate -> Coordinate -> Bool
dist k (x_c,y_c) (x_1,y_1) = ((abs (x_1 - x_c)) <= k) && ((abs (y_1 - y_c)) <= k)
这足以完全满足您的需要。如果两个坐标仅相距
1
dist 1
将返回
True
,内置函数
过滤器将从列表中提取所有元素
x
,这些元素会导致
dist 1 c x
返回
True
您创建函数

dist :: Int -> Coordinate -> Coordinate -> Bool
dist k (x_c,y_c) (x_1,y_1) = ((abs (x_1 - x_c)) <= k) && ((abs (y_1 - y_c)) <= k)

这足以完全满足您的需要。如果两个坐标仅相距
1
dist 1
将返回
True
,内置函数
filter
将从列表中提取所有元素
x
,这些元素导致
dist 1 c x
返回
True
,谢谢:)我知道filter与之有关。那么filter函数将返回一个包含所有匹配元素的新列表?@seedkey:不完全是这样。表达式
filter(dist 1c)
返回一个具有以下属性的函数:它接受坐标列表并返回坐标列表。返回的列表将只包含那些距离
1
最多
c
的坐标。您可以在ghci/hugs提示符中键入
:t filter
:t filter(dist 1 c)
,查看它们的类型。我明白了,谢谢:)我知道filter与此有关。那么filter函数将返回一个包含所有匹配元素的新列表?@seedkey:不完全是这样。表达式
filter(dist 1c)
返回一个具有以下属性的函数:它接受坐标列表并返回坐标列表。返回的列表将只包含那些距离
1
最多
c
的坐标。您可以在ghci/hugs提示符中键入
:t filter
:t filter(dist 1 c)
,查看它们的类型。虽然这有点吹毛求疵,但在功能程序中,one通常不会
元素添加到列表中。一旦变量得到一个值。它通常无法再改变该值。。。函数式编程使用持久的数据结构。虽然这有点吹毛求疵,但在函数式编程中,通常不会向列表中添加元素。一旦变量得到一个值。它通常无法再改变该值。。。函数式编程使用持久数据结构。