【问题标题】:Sorting in haskell with parameter using higher order function使用高阶函数在带有参数的haskell中排序
【发布时间】:2013-04-19 09:41:48
【问题描述】:

您好,我是 Haskell 初学者,我真的很迷茫。 这是我的任务,它要求我使用更高阶函数执行以下操作

Main> mySort (<) [1,5,3,6,4,1,3,3,2] 
[1,1,2,3,3,3,4,5,6] 
Main> mySort (>) [1,5,3,6,4,1,3,3,2] 
[6,5,4,3,3,3,2,1,1] 
Main> mySort longerWord [“Hello”, “The”, “a”, “Daniel”, “Declarative”]
[“Declarative”, “Daniel”, “Hello”, “The”, “a”]

首先,我想我应该做一个函数来区分它是 还是 longWord

checkConditionStr::String->Int
checkConditionStr str
    |str=="(<)" =1
    |str=="(>)" =2
    |str=="longerWord" =3

但该示例没有引号(即 mysort (

checkCondition::Ordering->Int
checkCondition ord
    |ord==(<) =1
    |ord==(>) =2
    |otherwise =2

其次,我仍然难以理解高阶函数。这有意义吗?

mySort::(String->Int)->[a]->[a]
mySort i list
    |i==1 map (sortBy compare) list
    |i==2 map (sortBy(flip compare)) list

【问题讨论】:

    标签: sorting haskell higher-order-functions


    【解决方案1】:

    您不应该专门匹配这些功能。它首先破坏了使用高阶函数的目的。事实上,你不能这样写,因为没有比较函数的通用方法。

    相反,直接使用传递的函数进行排序。这样,它将适用于任何合适的比较函数,而不仅仅是您明确为其编写代码的那些。

    例如,假设任务是使用传递的运算符组合两个值:

    combine (+) 2 3 = 5
    combine (*) 3 5 = 15
    combine max 10 100 = 100
    

    你会这样解决它:

    combine op x y = x `op` y
    

    你能用类似的方法来解决排序问题吗?

    提示:您可能需要定义一个辅助函数来将传递的比较函数转换为适合sortBy 的形式:

    compareUsing :: (a -> a -> Bool) -> (a -> a -> Ordering)
    compareUsing op x y = ...
    

    【讨论】:

    • 我会说比较函数是没有用的,因为高阶函数的整个想法是让它保持开放,以便注入将来会知道的东西。
    • 要么你没听懂我说什么,要么我没听懂你在说什么。我想说拥有myHighOrder f = if f == (&lt;) then ... 没有意义,因为在这种情况下,高阶函数将仅限于一组函数。因此可以直接写。虽然通常的高阶函数实际上是一个开放的函数族,可以通过任何满足某些限制的函数进行参数化。
    • @ony:这正是我要说的,或者试图在我的回答中说的。
    • 对我来说“不应该”在这种情况下听起来不像我喜欢的那么严格:)
    • @hammar 感谢您的回答,但我仍然无法解决这个问题。我花了很多时间,但太难理解了。
    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多