2016-10-08 19 views
2

これは本当に古い投稿でこれを見つけましたが、決して答えられないかもしれないので、質問したくありませんでした。誰かがこの単純なHaskellコードを私に詳細に説明することができます

f xs = maximum . filter (< maximum xs) $ xs 

それはリスト

&#x200Bの最大値未満であるフィルタリングされたリスト

  • の最大値を取って

    • あるようですが、私には見えます。

      secondLargest :: (Num a, Ord a) => [a] -> a 
      secondLargest [] = error "Empty List" 
      secondLargest [x] = error "Empty List" 
      secondLargest xs 
          | ((maximum . filter (< maximum xs) $ xs) >= (maximum xs)) = maximum xs 
          | otherwise = (maximum . filter (< maximum xs) $ xs) 
      

      上記コードは私が今作業しているものです。基本的に私はリストをソートすることができず、上記のコードは、最大と2番目に大きいものが同じでない限り、2番目に大きな要素を見つけます。

      誰でも光を放つのを手伝うことができますか?

  • +0

    を基本的に私は機能が合計であるので、あなたはすべてのケースを説明するために必要がある場合は、このような何かを行うことができますリストの中で2番目に大きい番号を見つけようとしていて、それが何であるのか分かりません。 – Juscallmesteve

    +1

    リストの2番目に大きな要素を返します。たとえば、 '[1,2,3,4,5]'を指定すると、 '4'が返されます。 –

    +0

    私は今持っている新しいコードを投稿しましたが、重複しているものでは機能しません。 – Juscallmesteve

    答えて

    4

    それは本当に簡単です:

    f xs = maximum . filter (< maximum xs) $ xs 
    

    はのはxs = [1,2,3,4,5]を想定してみましょう。従って、maximum xs = 5。したがって、我々は持っている:

    f [1,2,3,4,5] = maximum . filter (< 5) $ [1,2,3,4,5] 
    

    次に、我々は5未満のすべての要素をフィルタリングします。したがって、我々は得る:

    f [1,2,3,4,5] = maximum $ [1,2,3,4] -- notice that 5 is no more in the list 
    

    最後に、我々は残りの要素の最大値を取得:

    f [1,2,3,4,5] = 4 
    

    これは、元のリストの二番目に大きい要素であることを起こります。

    +0

    私のための完全な説明。ありがとうございました – Juscallmesteve

    +0

    リストが[1,2,3,4,5,5]だった場合、2番目の5はリスト内で2番目に大きいはずですが、5未満のすべてをフィルタリングするので逃した – Juscallmesteve

    +0

    そして<を<に変更した場合、リストが[1,2,3,4,5]である最初の状況では機能しません5 – Juscallmesteve

    1

    配列番号xsから2番目に大きい番号を見つけ、それを分解します。

    let xs = [1, 2, 3, 4] 
    let a = filter (< maximum xs) xs 
    -- a is an array of all elements from 'xs' except of the max elem of 'xs' 
    -- which is [1, 2, 3] 
    
    let b = maximum (a) -- gets the largest elem of a 
    -- b is th largest element of 'a' 
    -- which is 3 
    

    とその上maximumを適用するには、二番目に大きいelemを与えます。

    3

    コメントで尋ねたとおりに重複を考慮する場合は、filterの代わりにData.List.deleteを使用して最大の要素を削除できます。これは、それだけの単一のインスタンスを削除します:

    import Data.List (delete) 
    
    f xs = maximum . delete (maximum xs) $ xs 
    

    この利回り:もちろん

    λ. f [1,2,3,4,5] 
    4 
    λ. f [1,2,3,4,5,5] 
    5 
    

    を、これだけの長さ2以上のリストのために働きます。

    f xs | length xs >= 2 = maximum . delete (maximum xs) $ xs 
        | null xs  = 0 -- default case when the list is empty 
        | otherwise  = maximum xs 
    

    インポートせずにそれを行うには、あなたが手でdeleteを実装することができます:

    delete :: Eq a => a -> [a] -> [a] 
    delete x [] = [] 
    delete x (y:ys) | x == y = ys 
           | otherwise = y : delete x ys 
    
    +0

    私はプログラムでインポートを使用することができません。それ以外のあなたのプログラムは完璧です – Juscallmesteve

    +0

    インポートを使用せずにこのことについてどのように考えていますか? – Juscallmesteve

    +0

    はい、私は答えを更新しました。 – dkasak

    関連する問題