如何编写较短的代码,以便更广泛地使用它?

时间:2019-06-18 12:24:14

标签: haskell

我正在编写一个简单的搜索引擎,该引擎应该给出一个数据单元的单独参数。有没有更好(更短)的方式来编写此代码?预先感谢。

type Qualification = [QualAttrib]
type QualAttrib    = String
type Name          = String
type Type          = String
type Provider      = String

num1000101 :: Qualification
num1000101 = ["Mathematics","BSc","UCL"]

getQualName a = a !! 0
getQualType a = a !! 1
getProvider a = a !! 2```

2 个答案:

答案 0 :(得分:5)

首先使用列表没有多大意义。列表应用于项目的集合。但是这里"Mathematics"Name)和"BSc"Type)是正交项。它们只有“ happen ”具有相同的类型。如果以后要更改其中一项的类型,那么您甚至不能使用列表(或者至少不能不使用总和类型,这会使它更加难看)。

您最好为此使用一条记录,例如:

data Qualification = Qualification {
    qualName :: Name,
    qualType :: Type,
    qualProvider :: Provider
}

type Name = String
type Type = String
type Provider = String

现在您可以创建一个Qualification了:

num1000101 :: Qualification
num1000101 = Qualfication "Mathematics" "BSc" "UCL"

或更详细:

num1000101 :: Qualification
num1000101 = Qualification {
    qualName="Mathematics",
    qualType="BSc",
    qualProvider="UCL"
  }

令人高兴的是,编译器为您生成了函数qualName :: Qualification -> NamequalType :: Qualification -> TypequalProvider :: Qualification -> Provider,因此无需自己实现“获取器”。

答案 1 :(得分:3)

使用记录语法

data Qualification = Qualification { name :: String
                                   , qtype :: String  -- type is reserved word
                                   , provider :: String}  deriving (Show, Eq)

num1000101 = Qualification "Mathematics" "BSc" "UCL"

现在您拥有函数nameqtypeprovider可以用作吸气剂

> name num1000101
=> "Mathematics"