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

相关问题