2013-03-29 1 views
0

함수 목록과 인수를 취하는 함수를 작성하는 데 문제가 있습니다. 전달 된 인수로 각 함수를 호출하고 호출 결과 목록을 반환합니다. 예 : build [f, g, h] 2이 함수를 호출했지만 호출 대신 결과가 반환됩니다. [f(2), g(2), h(2)] 그런데 SML/NJ를 사용합니다. SML의 고차 함수 숙제

가 우선이 패턴의 많은 변종 시도 :

fun build functions TheArgument = if functions = [] then [] else 
    [hd(functions) TheArgument] @ build tl(functions) TheArgument; 

를하지만 다음과 같은 오류 준 : 마지막으로

stdIn:2.9-2.36 Error: operator is not a function [equality type required] 
    operator: ''Z 
    in expression: 
    (hd functions) TheArgument 
stdIn:1.10-2.70 Error: case object and rules don't agree [tycon mismatch] 
    rule domain: ''Z list * 'Y 
    object: ('X list -> 'X list) * 'W 
    in expression: 
    (case (arg,arg) 
     of (functions,TheArgument) => 
      if functions = nil then nil else (<exp> :: <exp>) @ <exp> <exp>) 

을, 나는 포기하고 몇 가지 조사를하려고 노력했다. Higher Order Functions in SML/NJ

나는이로 재정의하는 시도 :

fun build [] argument = [] 
| build f::rest argument = [f(argument)] @ build rest argument; 

그러나 컴파일러는이 뱉어 : 내가 잘못

stdIn:2.14-2.16 Error: infix operator "::" used without "op" in fun dec 
stdIn:1.10-2.67 Error: clauses don't all have same number of patterns 
stdIn:2.14-2.16 Error: data constructor :: used without argument in pattern 
stdIn:1.10-2.67 Error: types of rules don't agree [tycon mismatch] 
    earlier rule(s): 'Z list * 'Y -> 'X list 
    this rule: ('W -> 'V) * 'U * 'T * 'W -> 'V list 
    in rule: 
    (f,_,rest,argument) => (f argument :: nil) @ (build rest) argument 

를하고있는 중이 야 무엇을 나는 다음과 같은 질문을 찾았나요?

나는 심각한 손실이 있습니다. 나는 비밀스런 Java/C 오류 메시지를 처리 ​​할 수 ​​있습니다. 그러나 이것은 나에게 너무 외계인입니다.

p.s .: 함수는 build (functions, argument)를 통해 호출 할 수 없으며 두 개의 인수가 될 필요가 있고 두 개의 인수가 아닌 튜플이어야합니다.

+1

주 ...

fun build [] argument = [] | build (f::rest) argument = [f(argument)] @ build rest argument; 

그것은 SML 인터프리터 수없는이 목록은 따라서 것을 이해로 해결하는 대신 오 f append (@)를 사용하여 목록의 한 요소를 추가하려면 cons (: :)를 사용해야합니다. 일반적으로 가능한 경우 추가를 사용하지 않는 것이 좋습니다. 실행되지 않은 실행 시간으로 인해 오른쪽 목록이 큰 경우 특히 중요합니다. 이 경우 역순으로 목록을 작성한 다음 완료하면 역순으로 처리해야합니다. –

+0

최종 버전에서 잊어 버린 유일한 것은'f :: rest' 패턴 주위에 괄호를 넣는 것입니다. 그것들이 없다면 두 번째 방정식은'f','::','rest','argument' (첫 번째 방정식에 의해 표시된 두 개가 아닌) 네 개의 인수를 갖습니다. 그리고 컴파일러가 정확히 말한 것입니다 (그의 말로); – chris

답변

0

하나 개의 간단한 솔루션은 표준 고차 기능 맵을 사용하는 것입니다 :

fun build functions arg = map (fn f => f arg) functions; 
+0

감사합니다. 나는 바보처럼 느껴진다. – Albertoni

+0

@Albertoni 그건 그렇고, 당신의 원래 솔루션이 이렇게 일한 것 같습니다 : "재미있는 빌드 함수 arg = if (null 함수) then [] else ([(hd functions) arg] @ (빌드 (tl 함수) arg)); " 차이점은 hd/tl을 호출하고 빈 목록을 확인하는 것입니다. 오류 메시지는 특별한 경우에별로 도움이되지 않습니다. – svk

0
stdIn:2.14-2.16 Error: infix operator "::" used without "op" in fun dec 

이 위의 오류가 있기 때문에이 될 수 있도록 F :: 나머지 외부 brakets을 사용하지 않은입니다