2017-10-20 56 views
1

我正嘗試使用ImageSharp編輯F#中的圖像。我掙扎以獲取圖像突變工作F#中的圖像銳化變異#

要做到在C#中的形象突變,它看起來像你只需要使用mutate method and a lambda

image.Mutate(x => x.Kodachrome()) 

通常情況下,要改變C#lambda表達式到F#,我只想使用匿名函數,像這樣:

image.Mutate(fun x -> x.Kodachrome()) 

當我這樣做,我得到以下錯誤:

No overloads match for method 'Mutate'. The available overloads are shown below (or in the Error List window).

它看起來像Mutate方法需要一個ImageProcessor,但由於某種原因在F#編譯器無法弄清楚匿名函數是一個ImageProcessor。我如何獲得圖像變異在F#中工作?

+0

'Mutate'方法是否有任何重載? –

+1

我認爲它只有一個:(擴展名)Image.Mutate <'TPixel(需要默認的構造函數和值類型和'TPixel:> IPixel <'TPixel>和'TPixel:> ValueType)>([] operations:IImageProcessor <'TPixel> []) :單元 – Jonathan

+1

該參數類型看起來像一個接口,但您的C#代碼正在傳遞一個lambda表達式。這不計算。你確定這是唯一的超載嗎? –

回答

5

F#可以從一個匿名函數(fun ...)自動轉換爲System.Action<_>,但前提是類型完全匹配。在這裏,他們沒有,因爲Kodachrome()不返回unit。所以你需要忽略它的返回值:

image.Mutate(fun x -> x.Kodachrome() |> ignore) 
+0

F#很奇怪。爲什麼會期望一個uint? –

+1

不是單位。 F#相當於無效。 – Tarmil

+0

我很震驚這是多麼容易修復! – Jonathan

2

您需要將您的F#拉姆達轉換成明確的行動:

image.Mutate <| Action<_> (fun x -> x.Kodachrome())