我写这个函数:为什么这些表达式具有不同程度的模糊性?
||| 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)
究竟是怎么回事呢? 什么导致这些等价表达式具有不同的模糊程度?
伊德里斯类型推断还不如能够在哈斯克尔/阿格达。 –