并行声明函数是个好主意吗?

mb1*_*b14 6 haskell metaprogramming

回答这个问题,我意识到Haskell允许你在声明函数时解构对象并使用它来做并行函数定义.

基本上,让我们想象我想做这样的事情

 a = (1+)
 b = (2+)
 c = (3+)
 d = (4+)
 e = (5+)
Run Code Online (Sandbox Code Playgroud)

什么是DRYest写它的方式?我的意思是,毕竟模式是相同的:函数的名称既不能猜到要添加的数量,但我应该能够避免+每次都写(当然不使用模板Haskell).

基本上,我希望能够使用map或类似的东西,它似乎map只是工作!

[a,b,c,d,e] = map (+) [1..5]
Run Code Online (Sandbox Code Playgroud)

瞧瞧!

这更短,也许更具表现力,它的工作原理:

> a 10
11
> b 10
12
etc ...
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这是一个很好的模式(在那种情况下),如果没有,哪些是退缩(我知道购买经验,相当于Ruby是一个噩梦,但原因似乎没有适用于Haskell)?

更新

我理解这些代码的可读性是主观的,可以看作是基于意见的.但是,可能有一些客观原因不这样做.例如,在Ruby(至少1.8)中,使用的方法define_method 对于大多数IDE和标记构建器是不可见的.而且,你不能使用调试器等进入它们......这使得它们在实践中非常不方便.我在Haskell问类似的原因

GS *_*ica 8

一个缺点是

[a,b,c,d,e] = map (+) [1..5]
Run Code Online (Sandbox Code Playgroud)

是它需要非详尽的模式匹配 - 匹配不是静态保证有效.显然在这种情况下没有问题,但在一个更微妙的例子中,或许[1..5]在别处定义,可能更难看.

在这种特殊情况下,我也没有看到这种风格的任何特别优势,尽管我意识到这是一个人为的例子.

在一行中定义多个值的一种情况是值得的,如果你有一个返回元组的函数,例如:

(xs, ys) = unzip [(1, 'a'), (2, 'b')]
Run Code Online (Sandbox Code Playgroud)


Pet*_*lák 6

这可以使用同类元组的包(我是其作者)来完成:

import Data.Tuple.Homogenous

...
  let Tuple4 (a, b, c, d) = fmap (+) $ Tuple4 (1, 2, 3, 4)
   in ...
Run Code Online (Sandbox Code Playgroud)

不依赖于非详尽的模式匹配.

还有另一个类似的包tup-functor.