iMa*_*wCM -2 haskell list-comprehension list
早上好!
我试图定义一个列表,其中包含我之前定义的所有可能的地址类型,并使用列表理解来执行此操作.
以下是我对早期定义的看法,这些定义可能对您有所帮助:
data Row = A | B | C | D | E | F | G | H | I | J deriving (Enum, Ord, Show, Bounded, Eq, Read)
data Column = One | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten deriving (Enum, Ord, Show, Bounded, Eq, Read)
data Address = Address Row Column deriving (Show, Read, Eq)
data Cell = Cell Address Bool deriving (Show, Read, Eq)
Run Code Online (Sandbox Code Playgroud)
我不确定我是否需要在此解决方案中使用Cell,但也许.
这是我目前的解决方案,我想知道是否有人有改进它的建议,或者它可能只是完全错误.任何指导将不胜感激!
allAddressesA = [ x * y | x <- [Row] y <- [Column]]
Run Code Online (Sandbox Code Playgroud)
仅供参考,这是一个正式的书面要求:
将allAddressesA定义为所有可能的板地址列表.使用列表推导使用行和列类型的范围.
谢谢!我会密切关注这一点,所以请随时询问您需要澄清的任何内容.我感谢您花时间阅读本文并提供建议:)
你写:
这是我目前的解决方案,我想知道是否有人有改进它的建议,或者它可能只是完全错误.
是否完全错误当然可以轻松测试.只需输入并询问您的编译器:
allAddressesA = [ x * y | x <- [Row] y <- [Column]]
Run Code Online (Sandbox Code Playgroud)
我说:
parse error on input `<-'
Run Code Online (Sandbox Code Playgroud)
我猜这有点错误.
那么,让我们先修复语法.列表推导的第二部分中可能的多个子句(后面的部分|)将用逗号分隔.这样做会给出:
allAddressesA = [ x * y | x <- [Row], y <- [Column]]
Run Code Online (Sandbox Code Playgroud)
编译器对此有何看法?
Not in scope: data constructor `Row'
Not in scope: data constructor `Column'
Run Code Online (Sandbox Code Playgroud)
实际上,Row它Column是类型构造函数而不是数据构造函数.这意味着您可以使用它们来构建类型表达式,但不能构建"普通"值表达式.
显然,我们走错了路.那么让我们退一步吧.
您的Row类型和Column类型都属于类型Enum和Bounded.因此,我们可以轻松地分别生成包含所有行和列指示符的列表:
allRows = [minBound :: Row .. maxBound]
allColumns = [minBound :: Column .. maxBound]
Run Code Online (Sandbox Code Playgroud)
(使用minBound和maxBound使你的代码稍微更稳健的不是马上使用A和J,和One和Ten,分别在这个意义上,增加施工人员Row,并Column没有要求你改变的定义allRows和allColumns.)
在交互式环境中,我们可以轻松评估这些列表.的确,印刷allRows给出:
> allRows
[A,B,C,D,E,F,G,H,I,J]
Run Code Online (Sandbox Code Playgroud)
而且allColumns我们得到了
> allColumns
[One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten]
Run Code Online (Sandbox Code Playgroud)
现在,由于地址由行和列指示符组成,因此生成所有可能的地址只会简化为获取所有行和所有列的叉积.通过以前的定义allRows和现有定义allColumns,我们可以轻松地将这样的交叉产品编写为列表理解:
allAddresses = [Address row column | row <- allRows, column <- allColumns]
Run Code Online (Sandbox Code Playgroud)
由于您有10个行指示符和10个列指示符,因此您最终会得到一个10 x 10 = 100个地址的列表:
> length allAddresses
100
Run Code Online (Sandbox Code Playgroud)
为娱乐起见,让我们打印前15个:
> take 15 allAddresses
[Address A One,Address A Two,Address A Three,Address A Four,Address A Five,
Address A Six,Address A Seven,Address A Eight,Address A Nine,Address A Ten,
Address B One,Address B Two,Address B Three,Address B Four,Address B Five]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |