2

我寫這個函數:爲什麼這些表達式具有不同程度的模糊性?

||| Returns the ten largest values in the list. 
top_ten : Ord a => List a -> List a 

我第一次嘗試是一個pointfree實現使用功能組成:

top_ten = take 10 . reverse . sort 

但是這給了以下錯誤:

Main.idr:3:9:When checking right hand side of top_ten with expected type 
     List a -> List a 

Can't disambiguate name: Prelude.List.take, Prelude.Stream.take 

我的第二次嘗試是一個直截了當的有針對性的實施:

top_ten xs = take 10 (reverse (sort xs)) 

這工作,因爲做這些:

top_ten xs = take 10 $ reverse $ sort xs 
top_ten xs = take 10 (reverse $ sort xs) 
top_ten xs = take 10 $ reverse . sort $ xs 
top_ten xs = take 10 (reverse . sort $ xs) 

然而,這些並不:

top_ten xs = take 10 . reverse $ sort xs 
top_ten xs = take 10 . reverse . sort $ xs 
top_ten xs = take 10 $ (reverse . sort) xs 
top_ten xs = (take 10 . reverse) (sort xs) 
top_ten xs = take 10 ((reverse . sort) xs) 

究竟是怎麼回事呢? 什麼導致這些等價表達式具有不同的模糊程度?

+1

伊德里斯類型推斷還不如能夠在哈斯克爾/阿格達。 –

回答

2

根據AndrásKovács在他的評論中所說,Idris無法選擇正確的函數,這取決於您在範圍內的輸入(或函數)。

但是,您可以幫助伊德里斯:

top_ten: Ord a => List a -> List a 
top_ten = with Prelude.List take 10 . reverse . sort 
+0

謝謝!這並不完全是「爲什麼」的答案,但我不知道「with」語法。你能發佈一個鏈接到這個語法的文檔嗎?我在[主頁](https://www.idris-lang.org/)和[這個Google網上論壇帖子](https://groups.google.com/)上都能找到它。 d/MSG /伊德里斯琅/ qdiMrEpabpk/DbnwAKvKe94J)。 –

+0

我在文檔中找不到任何東西。這只是我遇到的情況,可能是通過閱讀郵件列表。 – Markus

+0

是否因爲'.'的定義被鍵入以允許依賴應用程序?如果你定義了你自己的不允許依賴類型化函數的組合版本(即只是'(b - > c) - >(a - > b) - > a - > c'),重載解析是否成功? – Cactus

相關問題