2015-05-17 2 views
0

простая задача: все, что я хочу, - это функция, применяющая список параметров к функции curried.Применить список параметров к функции в кармане

Предположим, что наша функция является известный add один:

fun add a b = a + b; 

Теперь все, что я хочу, это функция, чтобы применить список (скажем [1, 5]) в add. Это выглядело бы так:

apply add [1, 5]; 

Это кажется сложнее, чем я думал. Моя попытка:

fun apply f ps = foldl (fn (p, f') => f' p) f ps; 

Но это получает это веселое читаемое сообщение об ошибке:

Error: operator and operand don't agree [circularity] 
    operator domain: 'Z * ('Z -> 'Y) -> 'Z -> 'Y 
    operand:   'Z * ('Z -> 'Y) -> 'Y 
    in expression: 
    foldl (fn (p,f') => f' p) 

Теперь, что это неправильно о моей реализации? Возможно ли это в SML/NJ?

Приветствия и благодарности за подсказки и ответы.

ответ

4

Корень проблемы заключается в том, что для этого, чтобы работать, тип сложенной функции должен был бы измениться по мере ее свертывания по списку, и это (надеюсь, очевидно) невозможно.

«Круглость» в (fn (p, f') => f' p) происходит от того, что тип f' p должен быть таким же, как тип f'.

Моя личная интуиция заключается в том, что то, что вы пытаетесь, невозможно, потому что apply add [], apply add [1] и apply add [1,2] должны иметь разные типы.
И apply add [1,2,3] не имеет большого смысла.

Полезным упражнением может быть попытка записать тип apply.

+0

Да, я как-то подозревал это. Но все же, я действительно думаю, что должен быть способ достижения этой задачи ... – scheffield

+1

@scheffield. Ваш конкретный случай может быть жестко закодирован, но это не очень полезно. Я считаю, что вы могли бы решить общую проблему с системой типа Idris '- вам нужно было бы сопоставить арность функции с длиной списка, что, по моему мнению, * более или менее требовало бы типа Turing-complete система. Конечно, я также могу говорить из-за моего дна (каламбур). – molbdnilo

Смежные вопросы