Bab*_*ham 0 haskell type-conversion
我正在尝试将列表"profile1"中的数据转换为名为"DataSubject"的自定义类型.
我将此传递给函数'makeDS'以尝试此转换 - 但是以下操作不起作用:
type Name = String
type Age = Int
type Iq = Int
type Language = String
data DataSubject = DS {name :: Name, age :: Age, iq :: Iq, language :: Language} deriving (Show)
data Contain = Name String | Age Int | Iq Int | Language String deriving (Show) --Use so list can take multiple types
profile1 = [Name "Bob", Age 22, Iq 100, Language "French"]
makeDS :: [Contain] -> DataSubject
makeDS t = DS {name = t!!0, age = t!!1, iq = t!!2, language = t!!3}
main = do
let x = makeDS profile1
putStrLn $ show x
Run Code Online (Sandbox Code Playgroud)
错误:
Couldn't match type ‘Contain’ with ‘[Char]’
Run Code Online (Sandbox Code Playgroud)
我刚刚开始使用Haskell - 有人可以就我的错误提出建议吗?如果有更好的方法这样做?
在定义中makeDS,变量t是类型[Contain](即列表Contain),所以当你说t!!0这将提取该列表的第一个元素时,它具有类型Contain.问题是该name字段DataSubject包含a String(这是别名[Char]).所以你试图在一个Contain地方存储[Char],这是不可能的,因为类型是不同的.您需要在代码中使用不同的方法.
一个问题是每个Contain值代表一个单独的字段DataSubject.因此,如果给出一个列表Contain,则无法保证将按特定顺序(例如,Name首先,后跟Age等)给出值,或者甚至提供所有字段.即使您始终按照约定在代码中按特定顺序提供所有字段,haskell也不可能知道.一个不依赖于顺序的解决方案是尝试逐步"构建" DataSubject对象,从"空"开始DataSubject,然后检查列表Contain并添加相应的DataSubject字段:
makeDS :: [Contain] -> DataSubject
makeDS = foldr updateDS emptyDS
where
updateDS (Name s) ds = ds {name = s}
updateDS (Age n) ds = ds {age = n}
updateDS (Iq n) ds = ds {iq = n}
updateDS (Language s) ds = ds {language = s}
emptyDS = DS {name = "", age = 0, iq = 0, language = ""}
Run Code Online (Sandbox Code Playgroud)
所以在这里,我定义了emptyDS哪个是"空" DataSubject对象和一个调用的函数updateDS,它取一个(单个)Contain和一个DataSubject并DataSubject根据指定的字段更新Contain,然后返回它.最后,我使用折叠运行重复更新DataSubject(开始emptyDS)使用updateDS.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |