2014-07-06 77 views
6

回答這個question,我意識到Haskell允許你在聲明函數時解構對象,並用它來做並行函數定義。並行聲明函數是一個好主意嗎?

基本上,讓我們想象一下,我想這樣做

a = (1+) 
b = (2+) 
c = (3+) 
d = (4+) 
e = (5+) 

什麼是寫它的DRYest方式?我的意思是,畢竟模式是相同的:功能的名稱不能被猜測,也不能添加數量,但我應該能夠避免每次寫入+(當然,沒有使用模板哈斯克爾)。

基本上,我想能夠使用map或類似的東西,看起來map只是工作!

[a,b,c,d,e] = map (+) [1..5] 

等瞧!

這短得多,也許更有表現力,以及它的工作原理:

> a 10 
11 
> b 10 
12 
etc ... 

所以我的問題是,它是一個很好的模式來使用(在那種情況下),如果不是,這是平局(我知道購買經驗相當於紅寶石是一場噩夢,但其原因似乎並不適用於Haskell)?

更新

我理解這些代碼的可讀性主觀的,可以作爲基於意見中可以看出。但是,不這樣做可能有一些客觀的原因。例如,在Ruby(至少1.8)中,使用define_method定義的方法對大多數IDE和標籤構建器都是不可見的。而且,你不能使用調試器等進入它們,這使得它們在實踐中非常不方便。我在詢問類似的原因哈斯克爾

+7

這個問題吸引了「主要基於觀點的」近距離投票 - 雖然我認爲這個問題存在一定程度的主觀性,但它仍然有合理客觀的答案,應該保持開放。 –

回答

8

一個缺點與

[a,b,c,d,e] = map (+) [1..5] 

是,它需要非詳盡的模式匹配 - 比賽不是靜態保證有效。顯然在這種情況下沒有問題,但是在更細微的例子中,[1..5]可能在其他地方定義,可能很難看出。

在這種特殊情況下,我也沒有看到這種風格有任何特別的優勢,但我意識到這是一個有點人爲的例子。

一種情況在一行中定義多個值是值得的是,如果你有一個返回一個元組的功能,如:

(xs, ys) = unzip [(1, 'a'), (2, 'b')] 
+1

通過編寫'a:b:c:d:e:_ = map(+)[1 ..]'可以部分解決非窮盡性問題' –

6

這可以通過使用包homogeneous tuples(我敢來完成作者之一):

import Data.Tuple.Homogenous 

... 
    let Tuple4 (a, b, c, d) = fmap (+) $ Tuple4 (1, 2, 3, 4) 
    in ... 

而不訴諸非窮舉模式匹配。

還有另一個類似的包tup-functor

相關問題