f
とgetlast
の目的は、決してそれらを使用していない(そしてf
の "定義"は構文エラーです)可能性があるかどうかは不明です。
あなたは、この機能のごgetlast
外をテストする場合(これは通常は良いアイデアです)あなたはgetlast []
がSOME []
で、getlast [1,2,3]
がSOME [1,2,3]
であることがわかります。 getlast y
がSOME y
であっても、それに何を渡してもy
です。
また、List.filter func L
の結果は'a list
、ない'a option
なので、last
の定義として非常に有用ではありません。明示的な再帰を使用しているリストxs
で、このような要素を見つける
一つの方法:
xs
が空の場合、結果はNONE
です。
xs
が空でない場合、最初にxs
の末尾に「最後の要素」があるかどうかを確認します。
ある場合は、それは答えです。
がない場合には、
func
がxs
の頭のために保持している場合、それはあなたの答えです。
- そうでない場合、結果は
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