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问类似的原因
一个缺点是
[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)
这可以使用同类元组的包(我是其作者)来完成:
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.