gpt4 book ai didi

haskell - 我应该创建一个函数来将数据输入另一个函数吗?

转载 作者:行者123 更新时间:2023-12-02 10:55:39 26 4
gpt4 key购买 nike

我正在自学用 Haskell 编程,并且正在开发一个查找函数。它的作用是接受两个字符串,例如 "hello""he",并计算 "he" 出现的次数在“你好”中。

find 函数需要跟踪一些事情,例如该单词在列表中找到了多少次,这些不需要在函数开始时输入。因此,我将该函数分成两个较小的函数:用户最初将数据输入其中的一个函数,然后将数据定向到执行工作的第二个函数。

这是我的代码:

search :: (Eq a) => [a] -> [a] -> Integer
search [] _ = 0
search _ [] = 0
search x y = search1 x y y 0

search1 :: (Eq a) => [a] -> [a] -> [a] -> Integer -> Integer
search1 _ _ [] n = n
search1 x [] z n = search1 x z z (n+1)
search1 [] _ _ n = n
search1 (x:xs) (y:ys) z n
| x == y = search1 xs ys z n
| otherwise = search1 xs (y:ys) z n

在其中,用户不是从函数 search1 开始,它需要一些用户输入的多余数据,而是创建了函数 search将数据“插入”到用户的 search1 中。

我的问题是,在 Haskell 中创建一个“插入”冗余数据的函数是一个好的做法吗?或者我应该做一些不同的事情?

最佳答案

是的,这是一个很好的做法。但是,如果第二个函数本身没有用并且仅充当另一个函数的工作人员,那么通常最好将第二个函数设置为第一个函数的本地函数。

如果您在包装器本地创建一个工作器,则可以在工作器主体中引用包装器的参数,而无需将它们作为参数传递给工作器,这通常有助于提高性能。

对于您的示例,本地工作人员的函数可能如下所示

search :: (Eq a) => [a] -> [a] -> Integer
search [] _ = 0
search _ [] = 0
search hay needle = search1 hay needle 0
where
search1 x [] n = search1 x needle (n+1)
search1 [] _ n = n
search1 (x:xs) (y:ys) n
| x == y = search1 xs ys n
| otherwise = search1 xs (y:ys) n

其中我消除了在递归调用中从未更改的工作人员的一个参数。此外,将工作线程设置为本地就无需检查空的needle

关于haskell - 我应该创建一个函数来将数据输入另一个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10608280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com