将Bits8转换为'子集Nat (' LT ' 256) '



我有以下模块:

module Nat256
import Data.DPair
import Data.Bits
public export
bits8ToNat256 : Bits8 -> Subset Nat (`LT` 256)
bits8ToNat256 i =
case i of
0   => 0
1   => 1
2   => 2
3   => 3
4   => 4
5   => 5
6   => 6
7   => 7
8   => 8
9   => 9
10  => 10
11  => 11
12  => 12
13  => 13
14  => 14
15  => 15
16  => 16
17  => 17
18  => 18
19  => 19
20  => 20
21  => 21
22  => 22
23  => 23
24  => 24
25  => 25
26  => 26
27  => 27
28  => 28
29  => 29
30  => 30
31  => 31
32  => 32
33  => 33
34  => 34
35  => 35
36  => 36
37  => 37
38  => 38
39  => 39
40  => 40
41  => 41
42  => 42
43  => 43
44  => 44
45  => 45
46  => 46
47  => 47
48  => 48
49  => 49
50  => 50
51  => 51
52  => 52
53  => 53
54  => 54
55  => 55
56  => 56
57  => 57
58  => 58
59  => 59
60  => 60
61  => 61
62  => 62
63  => 63
64  => 64
65  => 65
66  => 66
67  => 67
68  => 68
69  => 69
70  => 70
71  => 71
72  => 72
73  => 73
74  => 74
75  => 75
76  => 76
77  => 77
78  => 78
79  => 79
80  => 80
81  => 81
82  => 82
83  => 83
84  => 84
85  => 85
86  => 86
87  => 87
88  => 88
89  => 89
90  => 90
91  => 91
92  => 92
93  => 93
94  => 94
95  => 95
96  => 96
97  => 97
98  => 98
99  => 99
100 => 100
101 => 101
102 => 102
103 => 103
104 => 104
105 => 105
106 => 106
107 => 107
108 => 108
109 => 109
110 => 110
111 => 111
112 => 112
113 => 113
114 => 114
115 => 115
116 => 116
117 => 117
118 => 118
119 => 119
120 => 120
121 => 121
122 => 122
123 => 123
124 => 124
125 => 125
126 => 126
127 => 127
128 => 128
129 => 129
130 => 130
131 => 131
132 => 132
133 => 133
134 => 134
135 => 135
136 => 136
137 => 137
138 => 138
139 => 139
140 => 140
141 => 141
142 => 142
143 => 143
144 => 144
145 => 145
146 => 146
147 => 147
148 => 148
149 => 149
150 => 150
151 => 151
152 => 152
153 => 153
154 => 154
155 => 155
156 => 156
157 => 157
158 => 158
159 => 159
160 => 160
161 => 161
162 => 162
163 => 163
164 => 164
165 => 165
166 => 166
167 => 167
168 => 168
169 => 169
170 => 170
171 => 171
172 => 172
173 => 173
174 => 174
175 => 175
176 => 176
177 => 177
178 => 178
179 => 179
180 => 180
181 => 181
182 => 182
183 => 183
184 => 184
185 => 185
186 => 186
187 => 187
188 => 188
189 => 189
190 => 190
191 => 191
192 => 192
193 => 193
194 => 194
195 => 195
196 => 196
197 => 197
198 => 198
199 => 199
200 => 200
201 => 201
202 => 202
203 => 203
204 => 204
205 => 205
206 => 206
207 => 207
208 => 208
209 => 209
210 => 210
211 => 211
212 => 212
213 => 213
214 => 214
215 => 215
216 => 216
217 => 217
218 => 218
219 => 219
220 => 220
221 => 221
222 => 222
223 => 223
224 => 224
225 => 225
226 => 226
227 => 227
228 => 228
229 => 229
230 => 230
231 => 231
232 => 232
233 => 233
234 => 234
235 => 235
236 => 236
237 => 237
238 => 238
239 => 239
240 => 240
241 => 241
242 => 242
243 => 243
244 => 244
245 => 245
246 => 246
247 => 247
248 => 248
249 => 249
250 => 250
251 => 251
252 => 252
253 => 253
254 => 254
255 => 255

当我编译它时,经过一个小时的编译,我得到了这个错误:


1/1: Building Nat256 (Nat256.idr)
Error: While processing right hand side of bits8ToNat256. Can't find an implementation
for Num (Subset Nat ({arg:0} => LT arg (fromInteger 256))).
Nat256:10:10--10:11
06 | public export
07 | bits8ToNat256 : Bits8 -> Subset Nat (`LT` 256)
08 | bits8ToNat256 i =
09 |   case i of
10 |   0   => 0
^

我不知道为什么我得到这个错误,因为零是一个完全有效的自然数在Idris。以下作品:

> the Nat 0
0

我怎样才能使这个程序在合理的时间内编译好呢?

您可以使用natToFin:

public export
bits8ToNat256 : Bits8 -> Fin 256
bits8ToNat256 i = case natToFin (cast i) 256 of
Just x => x
Nothing => assert_total $ idris_crash "byte value is outside 0-255 range"

正如@michaelmesser所建议的,我使用Fin.现在我只有性能差(它真的很慢)和不可能的case匹配的问题。Fin可以通过finToNat转换为Nat

module Fin256
import Data.Fin
import Data.Bits
public export
partial
bits8ToFin256 : Bits8 -> Fin 256
bits8ToFin256 i =
case i of
0   => 0
1   => 1
2   => 2
3   => 3
4   => 4
5   => 5
6   => 6
7   => 7
8   => 8
9   => 9
10  => 10
11  => 11
12  => 12
13  => 13
14  => 14
15  => 15
16  => 16
17  => 17
18  => 18
19  => 19
20  => 20
21  => 21
22  => 22
23  => 23
24  => 24
25  => 25
26  => 26
27  => 27
28  => 28
29  => 29
30  => 30
31  => 31
32  => 32
33  => 33
34  => 34
35  => 35
36  => 36
37  => 37
38  => 38
39  => 39
40  => 40
41  => 41
42  => 42
43  => 43
44  => 44
45  => 45
46  => 46
47  => 47
48  => 48
49  => 49
50  => 50
51  => 51
52  => 52
53  => 53
54  => 54
55  => 55
56  => 56
57  => 57
58  => 58
59  => 59
60  => 60
61  => 61
62  => 62
63  => 63
64  => 64
65  => 65
66  => 66
67  => 67
68  => 68
69  => 69
70  => 70
71  => 71
72  => 72
73  => 73
74  => 74
75  => 75
76  => 76
77  => 77
78  => 78
79  => 79
80  => 80
81  => 81
82  => 82
83  => 83
84  => 84
85  => 85
86  => 86
87  => 87
88  => 88
89  => 89
90  => 90
91  => 91
92  => 92
93  => 93
94  => 94
95  => 95
96  => 96
97  => 97
98  => 98
99  => 99
100 => 100
101 => 101
102 => 102
103 => 103
104 => 104
105 => 105
106 => 106
107 => 107
108 => 108
109 => 109
110 => 110
111 => 111
112 => 112
113 => 113
114 => 114
115 => 115
116 => 116
117 => 117
118 => 118
119 => 119
120 => 120
121 => 121
122 => 122
123 => 123
124 => 124
125 => 125
126 => 126
127 => 127
128 => 128
129 => 129
130 => 130
131 => 131
132 => 132
133 => 133
134 => 134
135 => 135
136 => 136
137 => 137
138 => 138
139 => 139
140 => 140
141 => 141
142 => 142
143 => 143
144 => 144
145 => 145
146 => 146
147 => 147
148 => 148
149 => 149
150 => 150
151 => 151
152 => 152
153 => 153
154 => 154
155 => 155
156 => 156
157 => 157
158 => 158
159 => 159
160 => 160
161 => 161
162 => 162
163 => 163
164 => 164
165 => 165
166 => 166
167 => 167
168 => 168
169 => 169
170 => 170
171 => 171
172 => 172
173 => 173
174 => 174
175 => 175
176 => 176
177 => 177
178 => 178
179 => 179
180 => 180
181 => 181
182 => 182
183 => 183
184 => 184
185 => 185
186 => 186
187 => 187
188 => 188
189 => 189
190 => 190
191 => 191
192 => 192
193 => 193
194 => 194
195 => 195
196 => 196
197 => 197
198 => 198
199 => 199
200 => 200
201 => 201
202 => 202
203 => 203
204 => 204
205 => 205
206 => 206
207 => 207
208 => 208
209 => 209
210 => 210
211 => 211
212 => 212
213 => 213
214 => 214
215 => 215
216 => 216
217 => 217
218 => 218
219 => 219
220 => 220
221 => 221
222 => 222
223 => 223
224 => 224
225 => 225
226 => 226
227 => 227
228 => 228
229 => 229
230 => 230
231 => 231
232 => 232
233 => 233
234 => 234
235 => 235
236 => 236
237 => 237
238 => 238
239 => 239
240 => 240
241 => 241
242 => 242
243 => 243
244 => 244
245 => 245
246 => 246
247 => 247
248 => 248
249 => 249
250 => 250
251 => 251
252 => 252
253 => 253
254 => 254
255 => 255
_ => idris_crash "byte value is outside 0-255 range"

相关内容

最新更新