【发布时间】:2017-07-23 22:03:52
【问题描述】:
我正在写这个函数:
||| 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)
这里到底发生了什么? 是什么导致这些等价表达式具有不同程度的歧义?
【问题讨论】:
-
Idris 类型推断的能力还不如 Haskell/Agda。
标签: overloading type-inference ambiguous idris function-composition