Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function ';辅助';Haskell函数_Function_Haskell - Fatal编程技术网

Function ';辅助';Haskell函数

Function ';辅助';Haskell函数,function,haskell,Function,Haskell,我的讲师现在有一个我以前从未见过的奇怪习惯,我想知道这是Haskell的标准还是他的编程风格的一个怪癖 基本上,他经常做这样的事情: functionEx :: String -> Int functionEx s = functionExA s 0 functionExA :: String -> Int -> Int functionExA s n = --function code 他调用这些“辅助”函数,在大多数情况下,我所能看到的唯一优点是使函数可以用较少的参数调

我的讲师现在有一个我以前从未见过的奇怪习惯,我想知道这是Haskell的标准还是他的编程风格的一个怪癖

基本上,他经常做这样的事情:

functionEx :: String -> Int
functionEx s = functionExA s 0

functionExA :: String -> Int -> Int
functionExA s n = --function code
他调用这些“辅助”函数,在大多数情况下,我所能看到的唯一优点是使函数可以用较少的参数调用。但无论如何,其中大部分都隐藏在代码中,在我看来,将参数添加到原始调用更具可读性


正如我所说,我并不是说我的观点是正确的,我只是以前从未见过这样的做法,我想知道它在Haskell中是否很常见。

如果经常使用特殊情况定义,那么这样做可能是一种优势。例如,和函数只是折叠函数的一个特例。那么我们为什么不每次都使用
foldr(+)0[1,2,3]
,而不是
sum[1,2,3]
?因为
sum
更具可读性

是的,这是司空见惯的,不仅仅是在函数式编程中。在代码中,最好将代码的接口(在本例中,这意味着函数签名:必须传递的参数)与实现的细节(递归代码中需要计数器或类似参数)分开

在现实编程中,这种情况的一种表现形式是一个函数具有默认参数或多个重载。另一种常见的方法是返回或获取接口的实例,而不是实现该接口的特定类。在Java中,这可能意味着从方法返回
列表
,而不是
ArrayList
,即使您知道代码实际上使用了
ArrayList
(其中
ArrayList
实现了
列表
接口)。在Haskell中,类型类通常具有相同的功能

“一个参数在开始时应始终为零”模式在现实世界中偶尔出现,但在函数编程教学中尤其常见,因为您想展示如何以递归样式编写相同的函数,而不是使用尾部递归。包装器函数对于证明两个实现实际上具有相同的结果也很重要

在Haskell中,更常见的用法是使用
where
,如下所示:

functionEx :: String -> Int
functionEx s = functionExA s 0 where
    functionExA s n = --function code

这样,即使是“实”函数的存在也会被外部接口隐藏。没有理由公开这个函数是(比如)带有count参数的尾部递归函数。

这是相当常见的,尽管辅助函数通常在
where
子句中,而不是在顶层。一个不同的、模糊相关的,经常使用的技巧是对参数重新排序,以便您可能希望使用单独定义隐藏的参数排在第一位。如果
functionExA
Int->String->Int
,您可以随意使用
functionExA 0::String->Int
,至少可以从一个单独的名称中获得一些好处。这是一个很好的例子。