2

私はml関数を使ってやっていて、いくつかの厄介なことがありました。

簡単なコードで説明します。たとえば、list(int * int)があり、最初の要素に3を含むタプルがあるかどうかを調べたいとします。

L = [(1,2),(2,3),(3,5),(3,4)]

したがって、このリストでは、5と4を取得したいと思います。ただし、MLでは、関数は再帰的であるため、このようなコードを記述した場合。

fun a(list) = 
    if #1(hd(list)) = 3 then #2(hd(list))
    else a(tl(list))

この単純な関数では、(3,5)が条件を満たしていることを検出すると、5を返し、関数が終了するため、5を取得できますが4は取得できません。

4も入手する方法はありますか?

4

2 に答える 2

3

条件が保持されているリストの末尾で関数を再帰的に呼び出すのを忘れました。

MLでは、ほとんど使用hdしませんtlが、代わりにパターンマッチングを使用します。また、タプルでパターンマッチングを行うと、読みやすくなります。

fun filter [] = []
  | filter ((x, y)::xys) = if x = 3 
                           then y::(filter xys)
                           else filter xys

また、リスト構造の高階関数は、それらを使用したい場合のもう1つのオプションです。

于 2012-09-28T06:50:04.757 に答える
3

私はmlを知りませんが、基本的に他のことをする代わりにあなたはこれをする必要があります:

fun a(list) =
  if list = nil then nil 
  else
    if #1(hd(list)) = 3
    then 
      #2(hd(list)) :: a(tl(list))
    else 
      a(tl(list))

(MLについて詳しく知るにつれて、この応答を徐々に編集しています:)

于 2012-09-28T02:23:47.187 に答える