2015-08-29 143 views
-1
与数据类型列表实现multiFilter
datatype 'a Multilist = 
    Node of 'a list 
| List of 'a Multilist list; 

fun isGreaterThen x y = y > x; 

fun multiFilter f (List([])) = [] 
    | multiFilter f (List(m::multil)) = 
    let fun flattenAuxiliray(Node(value)) = 
        if (f value = true) then (value) else nil 
      | flattenAuxiliray((List(nil))) = nil 
      | flattenAuxiliray(List(m::mlist1)) = (flattenAuxiliray(m)) @ 
        (flattenAuxiliray((List(mlist1)))) 
    in (flattenAuxiliray(m)) @ (multiFilter f (List(multil))) 
    end; 

我得到错误此输入:我怎么能在ML

val l = List [Node [3,5,18], Node [7]]; 
multiFilter (isGreaterThen 6) l; 

stdIn:7.1-8.46 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: ('Z list -> bool) * 'Z list Multilist 
    operand:   (int -> bool) * int list Multilist 
    in expression: 
    multiFilter (isGreaterThen 6,List (Node <exp> :: <exp> :: <exp>)) 

输出:

val it = [18,7] : int list 

回答

0

你的错误类型是说,第一个参数期待'Z list -> bool类型的东西,这意味着它是一个函数,它接受一个多态列表并返回一个布尔值。但是,您提供的功能需要int并返回一个布尔值。它应该在int s列表中返回并返回bool。您可以通过将isGreaterThan(类型int -> int -> bool)更改为int -> int list -> bool类型来实现此目的,该类型将将列表中的所有内容与第一个参数进行比较,仅当所有元素都较小时才返回true。

+0

我无法更改isGreaterThan和数据类型 – alex

0

您的问题,在这里有它的根:

flattenAuxiliray(Node(value)) = 
        if (f value = true) then (value) else nil 

你的数据类型说Node of 'a list所以value必须是'a list
由于您将f应用于value,f必须具有类型'a list -> bool,但您要通过isGreaterThan 6,其类型为int -> bool

flattenAuxiliray (Node value) = 
        List.filter f value 

(边注:括号中的丰度和缺乏的空白,使SML很难

你可能会为了消除所有不满足谓词的元素找filter 。阅读请记住,代码花费其大部分没有书面或执行的,而是由人类阅读时间)

功能齐全:

fun multiFilter f (List []) = [] 
    | multiFilter f (List (m::multil)) = 
    let fun flattenAuxiliary (Node ls) = List.filter f ls 
      | flattenAuxiliary (List []) = [] 
      | flattenAuxiliary (List (m::mlist1)) 
      = (flattenAuxiliary m) @ (flattenAuxiliary (List mlist1)) 
    in (flattenAuxiliary m) @ (multiFilter f (List multil)) 
    end; 

Interaction:

- multiFilter (isGreaterThan 6) (List [Node [3,5,18],Node [7]]); 
val it = [18,7] : int list 
+0

我只需要一次传递列表。 – alex

+0

@alex我不明白。 – molbdnilo

+0

我只能一次遍历列表。我的启动列表是List [Node [3,5,18],Node [7]] – alex