2015-11-05 6 views
0

Сколько функций присутствует в этом выражении? :Число функций в выражении - SML

'a -> 'a -> ('a*'a) 

Кроме того, как бы вы реализовали функцию, возвращающую этот тип? Я создал функции, которые имеют, например:

'a -> 'b -> ('a * b) 

Я создал это, выполнив:

fun function x y = (x,y); 

Но я попытался с помощью двух Х входов и я получаю ошибку, пытаясь вывести первый тип выражение.

Спасибо за помощь!

+0

Извините, я понял, что сделал, я имел в виду функцию xy = (x, y) –

+0

Я отредактировал свой вопрос –

+0

Я удалил свой комментарий ... – molbdnilo

ответ

1

Чтобы иметь два входа одного и того же альфа-типа, я должен указать тип обоих входов в альфа.

например

fun function (x:'a) (y:'a) = (x, y); 

==>

a' -> 'a -> (a' * 'a) 
+0

Это хороший ответ. Без каких-либо предположений о типе вы действительно не можете делать ничего, кроме форм кортежей, элементы которых вычерчены из пройденного 2. Легко видеть, что существует только 4 различных полиморфных чистых функций данного типа. –

1

Предполагая, что это домашнее задание, я не хочу говорить слишком много. -> в выражении типа представляет собой функцию. 'a -> 'a -> ('a * 'a) имеет две стрелки, поэтому 2 может быть ответом на ваш первый вопрос, хотя я нахожу этот конкретный вопрос непонятным. Можно было бы аргументировать, что каждый fun определяет точно одну функцию, которая может возвращать функцию для ее вывода. Кроме того, вы спрашиваете «сколько функций присутствует в выражении ...», но затем укажите строку, которая буквально имеет 0 функций в ней (описания типов описывают функции, но не содержат функций), так что, возможно, ответ 0.

Если вы хотите естественный пример int -> int -> int * int, вы могли бы реализовать функцию divmod где divmod x y возвращает кортеж, состоящий из частного и остатка от деления x на y. Например, вы хотите, чтобы divmod 17 5 возвращал (3,2). Это встроенная функция в Python, но не в SML, но ее легко определить в SML с помощью встроенных операторов div и mod. Полученная функция имела бы тип формы 'a -> 'a -> 'a*'a, но для специфический тип (а именно int). Вы должны сделать что-то, что немного менее естественно (например, что вы сделали в своем ответе на ваш вопрос), чтобы придумать полиморфный пример.