2017-02-26 12 views
0

ML機能はMLローカル環境

私の現在の機能は次のようになりますこれは:

fun last func nil = NONE 
| last func L = 
    let val f = 
     fun getlast(x) = SOME x 
     | getlast(x::xs) = getlast xs 
    in List.filter func L 
    end; 

誰でも私のコードをデバッグするのに役立つことができますまた私はMLのローカル環境を理解するのに役立ちますか?

答えて

1

fgetlastの目的は、決してそれらを使用していない(そしてfの "定義"は構文エラーです)可能性があるかどうかは不明です。

あなたは、この機能のごgetlast外をテストする場合(これは通常は良いアイデアです)あなたはgetlast []SOME []で、getlast [1,2,3]SOME [1,2,3]であることがわかります。 getlast ySOME yであっても、それに何を渡してもyです。

また、List.filter func Lの結果は'a list、ない'a optionなので、lastの定義として非常に有用ではありません。明示的な再帰を使用しているリストxsで、このような要素を見つける

一つの方法:

  • xsが空の場合、結果はNONEです。
  • xsが空でない場合、最初にxsの末尾に「最後の要素」があるかどうかを確認します。
    ある場合は、それは答えです。
    がない場合には、
    • funcxsの頭のために保持している場合、それはあなたの答えです。
    • そうでない場合、結果はNONEになります。 MLにこれを翻訳

、それは次のようになります。

fun last _ [] = NONE 
    | last f (x::xs) = case last f xs of 
         NONE => if f x then SOME x else NONE 
         | result => result 

あなたがList.filterを使用して手動で再帰を避けたい場合は、リストの最後の要素があることに注意してくださいそのリストの逆の最初の要素:

fun last f xs = case List.rev (List.filter f xs) of 
        [] => NONE 
        | y::ys => SOME y 
関連する問題