Haskell中的"辅助"功能

Ove*_*ent 4 haskell function

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

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

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

functionExA :: String -> Int -> Int
functionExA s n = --function code
Run Code Online (Sandbox Code Playgroud)

他称之为"辅助"函数,并且在大多数情况下,我可以看到的唯一优势是使用较少的提供参数来调用函数.但是大多数这些都隐藏在代码中,在我看来,在原始调用中添加参数更具可读性.

正如我所说的,我并不是说我的观点是正确的,我之前没有看到它像这样做,并且想知道它是否在Haskell中很常见.

Dan*_*lme 5

是的,这很常见,而且不仅仅是在函数式编程中.在代码中将接口与代码分开是很好的做法(在这种情况下,这意味着函数签名:您必须传递的参数)来自实现的细节(需要在递归代码中使用计数器或类似代码) .

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

在现实世界中偶尔会出现"一开始应该为零的一个参数"模式,但它在函数式编程教学中尤为常见,因为你想要展示如何以递归方式编写相同的函数而不是尾递归.包装函数对于证明两个实现实际上具有相同的结果也很重要.

在Haskell中,使用where如下更常见:

functionEx :: String -> Int
functionEx s = functionExA s 0 where
    functionExA s n = --function code
Run Code Online (Sandbox Code Playgroud)

这样,即使存在"真实"功能也会从外部接口隐藏.没有理由公开这个函数(比如说)使用count参数进行尾递归的事实.