相关疑难解决方法(0)

使用anamorphism列出过滤器

filter使用recursion-schemesHackage库中的变形函数实现了一个破坏的函数:

import Data.Functor.Foldable

xfilter :: (a -> Bool) -> [a] -> [a]
xfilter f = ana $ project . phi f

phi :: (a -> Bool) -> [a] -> [a]
phi f (h : t) | not (f h) = t
phi f l = l
Run Code Online (Sandbox Code Playgroud)

该功能不是忠实的实现filter:xfilter odd [1..5]工作,但xfilter odd [0,0]没有.我试图通过使用显式递归来实现"重试" phi,然后使用paramorphism重新实现,所以我结束于ana . para:

xfilter :: (a -> Bool) -> [a] -> [a]
xfilter f = ana …
Run Code Online (Sandbox Code Playgroud)

recursion haskell list corecursion recursion-schemes

11
推荐指数
1
解决办法
456
查看次数

测试可折叠元素的所有元素是否相同

我构建了一个函数来验证可折叠结构的所有元素是否相等。

与清单上的类似功能相比,在我看来,更通用的功能非常复杂,但是我无法对其进行简化。

你有什么建议吗?

import Data.Monoid
import Data.Sequence as SQ
import Data.Matrix as MT

allElementsEqualL :: Eq a => [a] -> Bool
allElementsEqualL [] = True
allElementsEqualL (x:ns) = all (== x) ns
-- allElementsEqualL [1,1,1] -> True

allElementsEqualF :: (Foldable t, Eq a) => t a -> Bool
allElementsEqualF xs = case (getFirst . foldMap (First . Just) $ xs) of
                        Nothing -> True
                        Just x  -> all (== x) xs

-- allElementsEqualF [1,1,1] -> True

-- allElementsEqualF $ SQ.fromList …
Run Code Online (Sandbox Code Playgroud)

haskell

11
推荐指数
3
解决办法
280
查看次数

使用Haskell的map函数计算列表的总和

哈斯克尔

addm::[Int]->Int
addm (x:xs) = sum(x:xs)
Run Code Online (Sandbox Code Playgroud)

我能够实现使用sum函数获得列表的总和但是可以使用函数获得列表的总和map吗?还有什么地图功能的使用?

recursion haskell list fold

8
推荐指数
4
解决办法
3万
查看次数

是否有一个简单的解决方案来接收元素* prior *并击中dropWhice谓词?

给定一个条件,我想搜索一个元素列表,然后返回达到条件的第一个元素和前一个。

在C / C ++中,这很容易:

int i = 0;
for(;;i++) if (arr[i] == 0) break;
Run Code Online (Sandbox Code Playgroud)

在获得满足条件的索引之后,通过“ arr[i-1]” 轻松获得上一个元素

在Haskell中:

  • dropWhile (/=0) list 给我们我想要的最后一个元素

  • takeWhile (/=0) list 给我们我想要的第一个元素

但是我看不到以简单的方式同时获得两者的方法。我可以枚举列表并使用索引,但这似乎很麻烦。是否有适当的方法可以解决此问题?

haskell functional-programming

6
推荐指数
1
解决办法
151
查看次数

使用“foldl”实现Haskell的“take”函数

使用. 实现 Haskelltakedrop函数foldl

关于如何使用foldl??实现 take 和 drop 功能有什么建议吗?

take x ls = foldl ???

drop x ls = foldl ???
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这些,但它显示错误:

myFunc :: Int -> [a] -> [a]
myFunc n list = foldl func [] list
    where 
    func x y | (length y) > n = x : y 
             | otherwise      = y
Run Code Online (Sandbox Code Playgroud)

产生错误:

*** Expression : foldl func [] list
*** Term : func
*** Type : a -> [a] -> …
Run Code Online (Sandbox Code Playgroud)

haskell list fold foldleft

2
推荐指数
1
解决办法
1733
查看次数