2014-10-17 3 views
1

Я использую этот пример из "Gentle Intro to ML"SML не признает Ord или CHR

fun incFirst s = chr(ord s + 1)^substring(s, 1, size s -1); 

Но мой «Standard ML Нью-Джерси v110.76 [построен: Вт 22 октября 14:04:11 2013] «Не нравится.

Error: operator and operand don't agree [tycon mismatch]

Я даже не могу это сделать:

> ord "c"; 

, не получив ошибку

Error: operator and operand don't agree [tycon mismatch]

Он не признает

load "Char"; 

либо. Что я делаю не так?

ответ

1

Вам необходимо сделать ord #"c", потому что "c" является строкой и #"c" является персонажем.

Ваша функция имеет две проблемы:

  1. Попытка склеить характер и строку, используя ^, который работает только на струнах
  2. Попытка использовать ord на шнурке

Углеродное решение таково:

fun incFirst s = 
    Char.toString(chr(ord(String.sub(s,0)) + 1))^substring(s, 1, size s -1); 

Я думаю, вы могли бы попробовать bly сделайте красивое решение, используя explode и implode и блок let с совпадением шаблонов, но я не помню достаточного синтаксиса SML с верхней части головы, чтобы сделать это.

+0

Спасибо, Даниэль. Кстати, есть ли хороший пример гиперчувствительности ML с примерами? – 147pm

+1

Нет гиперспека, но вы можете прочитать документацию [SML Basis] (http://sml-family.org/Basis/) онлайн. –

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