2016-11-23 37 views
1

所以我這最後一塊在管道使printfn在功能管線

|> Array.iter (fun name -> name 
           |> transform 
           |> printfn "RENAME '%s' INTO '%s'" name) 

變換更加清晰的是:

let transform (text: string) = 
    text.Replace(" ", ".") 

對我來說,iter謂詞功能還不是很清楚,它是說推名稱transform然後推printfn結果與原來的名稱附加到它....

有沒有辦法使轉換使用管道向前或向後操作員更多的意圖顯示。

我想,也許

name 
    |> printfn "RENAME '%S' INTO '%S'" 
    <| transform 

但顯然不起作用。

如果在管道中看起來不太好,那麼我想這是最簡潔的方式 - 除了做一個新的功能,將printfn以某種方式與變換相結合,但我不介意避免這種情況。 ..

我只是想確保我不會錯過任何簡單的語法..

我不覺得有什麼,因爲我面對一個函數,有多個參數,以便使用它在一個向前的管道中只能有1個參數,這實際上是我通過部分應用進行的操作。

回答

4

有時最好避免不必要的管道,因爲它可能會混淆代碼。 你的函數簡單地打印如下:

printfn "RENAME '%s' INTO '%s'" name (transform name) 

而且你可以通過使用<|省略括號:

printfn "RENAME '%s' INTO '%s'" name <| transform name 

這看起來更好恕我直言。

+0

所以最後一個表達式會在'Array.iter'旁邊,然後 –

+0

'Array.iter(有趣的名稱 - >'和主體,是的 –

2

也許在這種情況下跳過管道更清楚?

|> Array.iter (fun name -> printfn "RENAME '%s' INTO '%s'" name (transform name)) 

另外請注意,您的原始謂詞可以組成進一步像這樣:

|> Array.iter (transform >> printfn "RENAME '%s' INTO '%s'" name) 

,如果你想轉換到最後來到裏面可以這樣寫:

|> Array.iter ((printfn "RENAME '%s' INTO '%s'" name) << transform) 
+0

那裏,最後一個表達式看起來很不錯。很明顯,我丟失了一些東西 –

+0

最後兩個(組成部分)是不正確的,因爲'name'不存在於上下文中('fun name - >'部分丟失,導致組合可以' t在那裏使用(原樣),因爲參數需要不止一次 – Sehnsucht

1

這是怎麼樣的我怎麼會去這個任務:

let array = [| 
    "one" 
    "two" 
    "three" 
|] 


let transform s = s, s + "_transformed" 

let printIt (n,t) = printfn "RENAME '%s' INTO '%s'" n t 


array 
|> Array.map transform 
|> Array.iter printIt 

我的「最佳實踐」告訴我,我總是要創建和使用功能。這樣流量(地圖和iter)是恆定的,並且功能或數據可能會改變。

補遺「澄清」爲什麼要使用的功能和我們去什麼不可以

let myPipeLineWithPrint t p a= 
    a 
    |> Array.map t 
    |> Array.iter p 

//"Old" Version With above data 
myPipeLineWithPrint transform printIt array 


type SomeRecord = { 
    Name: string 
    MoreStuff: string 
} 

type OtherRecord = { 
    NewName: string 
    OldName: string 
} 


let array2 = [| 
    {Name="one"; MoreStuff="dontcare"} 
    {Name="two"; MoreStuff="dontcare"} 
    {Name="three"; MoreStuff="dontcare"} 
|] 

let transform2 {Name=n; MoreStuff=ms} = transform n 

myPipeLineWithPrint transform2 printIt array2 


let transform3 {Name=n; MoreStuff=_} = 
    let (_,nn) = transform n 
    {NewName= nn; OldName=n} 

let printIt2 {NewName=nn; OldName = o} = printfn "RENAME '%s' INTO '%s'" o nn 

myPipeLineWithPrint transform3 printIt2 array2 
+0

我很欣賞提供這個答案的時間,但是,我很努力地看到這個答案從我的問題中得到了什麼,你能詳細說明一下嗎,例如's,s +「_transformed」'這是什麼? –

+0

我已經運行了它,它確實提供了期望的輸出,但是我確實覺得這是有點抽象的,我確實提到過你可以通過重構一個函數來做到這一點,但我想試着保留'printfn'與管線一致,如果這是有道理的? –

+0

@CallumLinington問題是現在這可能很簡單。如果您想在稍後的某個時間更改內容,並更改數據在流水線中的定義或處理方式或其印刷方式,則可能是因爲您有多個打印位置,它是一件好事實際上有功能。最有可能的是管道是好的,但是數據正在經歷什麼,以及數據如何打印實際上正在改變。 –