Sono un linguista che lavora sulla sintassi formale/semantica dei linguaggi naturali. Ho iniziato con lo usando Haskell abbastanza recentemente e molto presto ho capito che avevo bisogno di aggiungere il sottotipo. Ad esempio, dati i tipi Human e Animal, mi piacerebbe avere Human come sottotipo di Animal. Ho scoperto che questo è possibile utilizzando una funzione coerce in cui le istanze sono dichiarate dall'utente, ma non so come definire la coercizione nelle istanze a cui sono interessato. Quindi in sostanza non so cosa aggiungere dopo 'coerce = 'per farlo funzionare'. Ecco il codice fino a quel momento:Sottotipi per i tipi di linguaggio naturale
{-# OPTIONS
-XMultiParamTypeClasses
-XFlexibleInstances
-XFunctionalDependencies
-XRankNTypes
-XTypeSynonymInstances
-XTypeOperators
#-}
module Model where
import Data.List
data Animal = A|B deriving (Eq,Show,Bounded,Enum)
data Man = C|D|E|K deriving (Eq,Show,Bounded,Enum)
class Subtype a b where
coerce :: a->b
instance Subtype Man Animal where
coerce=
animal:: [Animal]
animal = [minBound..maxBound]
man:: [Man]
man = [minBound..maxBound]
Grazie in anticipo
Se davvero bisogno subtyping, quindi utilizzare un linguaggio che lo supporta. Quindi stai cercando linguaggi ibridi OO-funzionali. Suggerirei di dare un'occhiata a Scala, che ha la maggior parte delle funzioni di Haskell (solo un po 'più prolisso) e un eccellente sistema di tipo OO. Avere sottotitoli in Haskell è certamente possibile, ma è solo una stampella. – Landei