Haskell 处理字符列表

标签 haskell functional-programming

我是 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/

相关文章:

R函数式编程: using apply family to calculate kernel matrix for gaussian processes

Java 11 编译器无法识别 main 方法中的静态 BiFunction

haskell - 为什么 GHC 不针对常量进行优化?

haskell - 使用 Haskell 的类型系统来强制模块化

haskell - `where` block 中的全局 CAF - Haskell

list - 用于将数据 append 到列表末尾的 Data.Sequence 与 Data.DList

haskell - `<$>`/`<*>`/`join` 的组合等于 `>>=` 吗?

javascript - 在 JavaScript 中实现 Lisp 的缺点

scala - 优化一个免费的 Monad

haskell - uncurry ($) 有什么作用?