OCaml шаблон сопоставления проблем при добавлении в хэш-таблицы - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над назначением переводчика в OCaml, в котором мне нужно связать значения.Например, мне может потребоваться привязать значение «A» к значению 3.

Я пытаюсь использовать модуль хэш-таблицы в ocaml для достижения удобства хранения и поиска, но, похоже, возникли многочисленные проблемы, связанные св область видимости и возвращают типы.

Что я хочу сделать, это когда случай, когда второе значение, извлеченное из стека, имеет тип имени, я хочу связать NAME с любым первым извлеченным значением и затем добавитьUNIT в стек.К сожалению, по некоторым причинам мое решение не работает.Кто-нибудь может мне помочь?

open Hashtbl;;

let bound_values = Hashtbl.create 123456        
type stackVal =    
INT of int    
| STR of string    
| BOOL of bool    
| NAME of string    
| UNIT of unit    
| ERROR        

let callBind (stk : stackVal list) : stackVal list =    
match (stk) with    
x::NAME(y)::stk -> UNIT(Hashtbl.add bound_values y x)::stk    
| _ -> ERROR::stk

1 Ответ

0 голосов
/ 19 ноября 2018

Вам нужно определить тип stackVal до определения вашей хеш-таблицы.В противном случае тип технически находится во внутренней области видимости.Другой способ сказать, что вы ожидаете, что таблица будет содержать значения типа, который не существовал при создании таблицы.

Вот два небольших примера, показывающих влияние двух заказов:

$ ocaml
        OCaml version 4.06.1

# let ht = Hashtbl.create 1;;
val ht : ('_weak1, '_weak2) Hashtbl.t = <abstr>
# type t = A | B;;
type t = A | B
# let () = Hashtbl.add ht "key" A;;
Error: This expression has type t but an expression
was expected of type 'a
The type constructor t would escape its scope
#

$ ocaml
        OCaml version 4.06.1

# type t = A | B;;
type t = A | B
# let ht = Hashtbl.create 1;;
val ht : ('_weak1, '_weak2) Hashtbl.t = <abstr>
# let () = Hashtbl.add ht "key" A;;
# Hashtbl.find ht "key";;
- : t = A
#

Как примечание, я бы не стал открывать модуль Hashtbl.Ваш код уже использует полные имена (Hashtbl.x), поэтому открывать его не имеет смысла.И лучше всего открыть как можно меньше модулей.

...