嗨,我是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”]
首先,我认为我应该创建一个区分是否&lt; ,&gt;或更长的话
checkConditionStr::String->Int
checkConditionStr str
|str=="(<)" =1
|str=="(>)" =2
|str=="longerWord" =3
但是示例没有引号(即mysort(&lt;)而不是我的排序“(&lt;)”所以这是我的第一个问题。我对这个函数进行了测试,但它没有编译。否则是为了longWord
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
答案 0 :(得分:5)
你不应该专门针对这些功能。它首先违背了使用高阶函数的目的。事实上,你不能这样写,因为没有比较函数的一般方法。
相反,直接使用传递的函数进行排序。这样,它将适用于任何合适的比较函数,而不仅仅是您明确编写代码的函数。
例如,假设任务是使用传递的运算符组合两个值:
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 = ...