programming language 第三周作业答案

//解法一
val only_capitals = List.filter (fn str => Char.isUpper o String.sub(str,0)) 
//解法二
fun only_capitals x = List.filter (fn str => Char.isUpper(String.sub(str,0)) x

fun only_capitals x = List.filter (fn str => Char.isUpper(String.sub(str,0)) x

fun longest_string1 list = List.foldl (fn (s,acc) => if String.size s > String.size acc then s else acc) "" list

val longest_string2 = List.foldl (fn (s,acc) => if String.size s< String.size acc then acc else s) ""

fun longest_string_helper f strings =
  foldl (fn(x,y) => if f(String.size x, String.size y) then x else y) "" strings

val longest_string3 =
  longest_string_helper (fn (x,y) => x > y)

val longest_string4 =
  longest_string_helper (fn (x,y) => x >= y)

fun longest_capitalized list =( longest_string1 o only_capitals ) list

val rev_string = implode o rev o explode

fun first_answer f list =
    case list of
    [] => raise NoAnswer
      | x::xs => case f x of
             SOME v => v
           | NONE => first_answer f xs

fun all_answers f list =
    let
    fun helper acc list =
        case (acc,list) of
        (_,[]) => acc
          | (SOME v,x::xs) =>( case f x of
                 SOME xv => helper (SOME (xv @ v)) xs
                    | NONE => NONE)
                  | _ => NONE 

    in
    helper (SOME []) list
    end

val count_wildcards = g (fn () =>1) (fn x => 0)

val count_wild_and_variable_lengths = g (fn () => 1) (fn s => String.size s)

fun count_some_var (s,p) =
    g (fn() => 0) (fn str => if(s = str) then 1 else 0) p

//解法一
fun check_pat p =
    let
    fun filterString pat acc = case pat of
                       Variable x => x :: acc
                     | ConstructorP (_, p) => filterString p acc
                     | TupleP ps =>
                       List.foldl
                       (fn (p, acc) => (filterString p []) @ acc) [] ps
                     | _ => []
    in
    let
        val strList = filterString p []
        fun checkDuplicate remList = 
        case remList of
            [] => true
          | x :: xs => if List.exists (fn item => item = x) xs
                   then false
                   else checkDuplicate xs
    in
        checkDuplicate strList
    end
    end
 \\解法二
 fun check_pat p =
    let
    fun makeList patron =
        case patron of
        Variable s => [s]
          | TupleP ps => List.foldl (fn(i,acc) => (makeList i) @ acc) [] ps
          | _ => []

    fun check lista =
        case lista of
        [] => true
          | x::xs => if((List.exists(fn y => if(x = y)
                         then true 
                         else false) xs)) 
             then 
                 false
             else
                 true andalso check xs
    in
    (check o makeList) p
end

fun match valptrn =
  case valptrn
    of (_, Wildcard) => SOME []
     | (v, Variable s) => SOME [(s, v)]
     | (Unit, UnitP) => SOME []
     | (Const v, ConstP v') => if v = v' then SOME [] else NONE
     | (Tuple vs, TupleP ps) =>
         if length(vs) = length(ps)
         then all_answers match (ListPair.zip(vs, ps))
         else NONE
     | (Constructor(s2, v), ConstructorP(s1, p)) => 
         if s1 = s2
         then match(v, p)
         else NONE
     | _ => NONE

fun first_match v ptrnlist =
  SOME(first_answer (fn p => match(v, p)) ptrnlist)
  handle NoAnswer => NONE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值