使用高阶函数在haskell中使用参数进行排序

1 sorting haskell higher-order-functions

嗨,我是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”]
Run Code Online (Sandbox Code Playgroud)

首先,我认为我应该创建一个区分它是<,>还是更长的函数

checkConditionStr::String->Int
checkConditionStr str
    |str=="(<)" =1
    |str=="(>)" =2
    |str=="longerWord" =3
Run Code Online (Sandbox Code Playgroud)

但是这个例子没有引号(即mysort(<)不是我的排序"(<)"所以这是我的第一个问题.我这个函数但它没有编译.否则就是longWord

checkCondition::Ordering->Int
checkCondition ord
    |ord==(<) =1
    |ord==(>) =2
    |otherwise =2
Run Code Online (Sandbox Code Playgroud)

其次,我仍然难以理解高阶函数.这有道理吗?

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

ham*_*mar 5

你不应该专门针对那些功能.它首先违背了使用高阶函数的目的.事实上,你不能这样写,因为没有比较函数的一般方法.

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

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

combine (+) 2 3 = 5
combine (*) 3 5 = 15
combine max 10 100 = 100
Run Code Online (Sandbox Code Playgroud)

你会像这样解决它:

combine op x y = x `op` y
Run Code Online (Sandbox Code Playgroud)

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

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

compareUsing :: (a -> a -> Bool) -> (a -> a -> Ordering)
compareUsing op x y = ...
Run Code Online (Sandbox Code Playgroud)