1

こんにちは、私は 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”]

まず、<、>、それより長いかを区別する関数を作ろうと思いましたWord

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

しかし、この例には引用符がありません (つまり、mysort (<) は my sort"(<)" ではありません)。これが最初の問題です。この関数を作成しましたが、コンパイルされていません。

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
4

1 に答える 1

5

これらの関数に対して具体的に一致することは想定されていません。そもそも高階関数を使用する目的に反します。実際、関数を比較する一般的な方法がないため、このように書くことはできません。

代わりに、渡された関数を直接ソートに使用してください。そうすれば、明示的にコードを記述したものだけでなく、適切な比較関数でも機能します。

たとえば、タスクが渡された演算子を使用して 2 つの値を結合することであると想像してください。

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 = ...
于 2013-04-19T10:05:48.047 に答える