我是 Haskell 新手,我有一个表示为顶点列表的多边形
vert = ['m', 'n', 'o', 'p', 'q']
我想返回所有对角线。结果应该是
[(m, o), (m, p), (n, p), (n, q), (o, q)]
我有下面的代码,但我得到了一个错误输入时解析错误
,即使我只输入(tail (find2 x vert))
我得到了一个很多其他错误。
vert = ['m', 'n', 'o', 'p', 'q']
find2 :: Char -> [Char] -> [Char]
find2 ch (x:xs) = if x == ch then (x:xs) else find2 ch xs
diagonals = foldl (\acc x -> acc ++
foldl (\ acc2 y -> acc2 ++ (x:y)
[]
if x == (head vert)
then (init (tail (find2 x vert)))
else (tail (find2 x vert)))
[] vert
find2 函数返回从字符开始的列表的子列表。
最佳答案
您可以将对角线定义为所有边和边之间的差异,这两者都更容易生成
例如
edges :: [a] -> [(a,a)]
edges [] = []
edges [x] = []
edges (x:xs) = (map ((,) x) xs) ++ edges xs
和
sides :: [a] -> [(a,a)]
sides [] = []
sides [x] = []
sides (x:xs) = zip (x:x:init xs) (last xs:xs)
现在
import Data.List((\\))
diagonals x = edges x \\ sides x
三角形不应该有对角线
> diagonals [1..3]
[]
> diagonals [1..4]
[(1,3),(2,4)]
> diagonals vert
[('m','o'),('m','p'),('n','p'),('n','q'),('o','q')]
关于Haskell 处理字符列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36393010/