Оператор SML и операнд не согласны - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь написать свою первую функцию в sml. Он принимает кортеж и возвращает сумму умножения первого элемента 10, времен второго элемента 6 и третьего, а затем делит на 10. Я не знаю, что я здесь делаю неправильно, я получаю этот оператор ошибки и операнд не согласен [ несоответствие тайкона].

fun rgb2gray(rgb: (int*int*int))=
let
    val x = (#1rgb * 3 )+ (#2rgb * 6 )+ (#3rgb)
in  
    x=x/10
end

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Поскольку molbdnilo уже предоставил ответ, вот альтернативный способ сделать это, используя records :

type rgb = { r : int, g : int, b : int }

fun rgb2gray (color : rgb) : int =
    (#r color * 3 +
     #g color * 6 +
     #b color) div 10

или эквивалентно путем сопоставления с образцом в записях:

fun rgb2gray ({ r = r, g = g, b = b } : rgb) : int =
    (r * 3 + g * 6 + b) div 10

Записи похожи на кортежи, но их части именуются, а не нумеруются (следовательно, #r вместо #1). Синтаксис немного сложнее, но с другой стороны, вы не случайно смешиваете два цвета так же легко. Возможно, для значений RGB их все равно сложно смешать, поскольку понятия R, G и B в этом точном порядке довольно укоренились во многих программистах. Тем не менее, это еще один вариант.

2 голосов
/ 03 февраля 2020

x=x/10 - это сравнение на равенство (и оно будет истинным, только если x - ноль), а / - для деления real с, а не целых чисел.
(+, - и * перегружены, но / нет.)

Целочисленное деление называется div, и поскольку значение функции должно быть x div 10, вам нужно только написать x div 10, без каких-либо =.

Для сопоставления структур чаще используется сопоставление с образцом, чем с селекторами, и я написал бы вашу функцию так:

fun rgb2gray (r, g, b) = (r * 3 + g * 6 + b) div 10
0 голосов
/ 08 февраля 2020

Поскольку кажется, что другие уже помогли вам решить проблему, я подумал, что я хотел бы указать, что после окончания вам понадобится; после этого, так как функция выполнена.

...