Как я могу разобрать пользовательский тип в форме пищеварительных функторов?

У меня нет проблем с попыткой разобрать встроенные типы в форме пищеварительных функторов, например, у меня есть тип клиента (сгенерированный постоянной библиотекой), который ссылается на идентификатор страны (типа ключевой страны):

Client
  :: String
     -> String
     -> String
     -> Database.Persist.Class.Key Country
     -> Maybe Int
     -> Client

Затем я определяю значение clientForm:

clientForm :: Monad m => Form String m Client                                                                           
clientForm = Client <$> "firstName" .: string Nothing                                                                   
                    <*> "lastName"  .: string Nothing                                                              
                    <*> "address"   .: string Nothing                                                              
                    <*> "country"   .: stringRead "Cannot parse country" Nothing                                   
                    <*> "age"       .: optionalStringRead "Cannot parse age" Nothing        

Странно, но clientForm при отправке (POST) не может проанализировать поле идентификатора страны.

Неправильно ли использовать "stringRead" для разбора типа "Key Country" (который можно получить из "toSqlKey int64")?

1 ответ

После некоторой помощи от dmwit Freenode #haskell, следующее решит проблему:

clientForm :: Monad m => Form String m Client                                                                           
clientForm = Client <$> "firstName" .: string Nothing                                                                   
                <*> "lastName"  .: string Nothing                                                              
                <*> "address"   .: string Nothing                                                              
                <*> (toSqlKey <$> "country" .: stringRead "Cannot parse country id." Nothing)                                   
                <*> "age"       .: optionalStringRead "Cannot parse age" Nothing

Я думаю, что путаница произошла из-за того факта, что тип "ключевой страны" (новый тип) не может быть "прочитан" непосредственно из целого числа...

Другие вопросы по тегам