0

我处于使用定义为类型同义词的元组的情况,所以我不能真正使用记录结构。有没有办法获得这些元素?

更具体地说,我的意思是:

 type Movie  = (Title, Regisseur, MainActors, ReleaseDate, Genre, SalesPrice)  

 type Title = String

 type SalesPrice = Int   

 etc

我怎样才能得到Title一个ReleaseDate例子。当然,除了为元组中的每个位置定义一个 getter 函数之外。

4

3 回答 3

7

One other option is to import the package Control.Lens.

>>> import Control.Lens
>>> let movie = ( "The Terminator"
                , "James Cameron"
                , ["Arnold Schwartzenegger", "Michael Biehn"]
                , 1984
                ,"Science Fiction"
                , 19.99)
>>> movie ^. _1
"The Terminator"
>>> movie ^. _4
1984

I wouldn't recommend that you do this though. Use record syntax instead.

data Movie = Movie
           { title       :: String
           , director    :: String
           , mainActors  :: [String]
           , releaseDate :: Int
           , genre       :: String
           , price       :: Double
           } deriving (Eq,Ord,Show)

Now you can do

>>> let movie = Movie "The Terminator" "James Cameron"
                      ["Arnold Schwartzenegger", " Michael Biehn"]
                      1984 "Science Fiction" 19.99
>>> title movie
"The Terminator"
>>> releaseDate movie
1984
于 2013-07-29T13:36:44.830 回答
4

您需要为元组的每个组件定义(或派生)一个 getter。

例如

title :: Movie -> Title
title (t,_,_,_,_,_,_) = t

通过使用记录,可以使此类访问器变得更简单。

于 2013-07-29T13:10:41.090 回答
2

您可以使用 uniplate 来获取特定类型的所有元组元素。请注意,uniplate 会将不同类型的同义词视为相同。

import Data.Generics.Uniplate.Data
.
.
.
let [title] = childrenBi movie

如果您想要区分字段的内容,最好使用记录语法:Haskell 记录语法

于 2013-07-29T13:11:30.863 回答