我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) 我构建了一个函数来验证可折叠结构的所有元素是否相等。
与清单上的类似功能相比,在我看来,更通用的功能非常复杂,但是我无法对其进行简化。
你有什么建议吗?
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) 哈斯克尔
addm::[Int]->Int
addm (x:xs) = sum(x:xs)
Run Code Online (Sandbox Code Playgroud)
我能够实现使用sum函数获得列表的总和但是可以使用函数获得列表的总和map吗?还有什么地图功能的使用?
给定一个条件,我想搜索一个元素列表,然后返回达到条件的第一个元素和前一个。
在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 给我们我想要的第一个元素
但是我看不到以简单的方式同时获得两者的方法。我可以枚举列表并使用索引,但这似乎很麻烦。是否有适当的方法可以解决此问题?
使用. 实现 Haskelltake和drop函数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)