我正在尝试在 Haskell 中编写一个函数来生成多维列表。
(从技术上讲,我使用的是 Curry,但我的理解是它主要是 Haskell 的超集,而我正在尝试做的事情对 Haskell 来说也很常见。)
经过一番挠头后,我意识到我最初想要的函数(m_array generating_function list_of_dimensions
,给一个嵌套深度等于的列表length list_of_dimensions
)可能与它们的类型系统本身不一致,因为(AFAICT)列表的嵌套深度是它的一部分类型,我的函数想要返回嵌套深度根据参数值而不同的值,这意味着它想要返回类型根据值而变化的值Haskell 不支持 (AFAICT) 的参数。(如果我错了,这可以做到,请告诉我。)此时我转到下一段,但如果有一个我错过的解决方法,它采用非常相似的参数并且仍然输出一个嵌套列表,让我知道。就像,也许如果您可以将索引编码为某种数据类型,该数据类型在其类型中隐含包含嵌套级别,并用 eg 实例化dimensions 5 2 6 ...
,那可能可行吗?没有把握。
无论如何,我认为也许我可以通过嵌套函数本身来编码嵌套深度,同时仍然保持参数可管理。这确实有效,我最终得到以下结果:
ma f (l:ls) idx = [f ls (idx++[i]) | i <- [0..(l-1)]]
但是,到目前为止,使用起来还是有点笨拙:您需要嵌套调用,例如
ma (ma (ma (\_ i -> 0))) [2,2,2] []
(顺便说一句,它给出了[[[0,0],[0,0]],[[0,0],[0,0]]]
。如果你使用(\_ i -> i)
,它会用相应元素的索引填充数组,这是我想保持可用的结果,但可能是一个令人困惑的例子。)
我宁愿尽量减少必要的样板文件。如果我不能打电话
ma (\_ i -> i) [2,2,2]
我希望能够打电话,最坏的情况,
ma ma ma (\_ i -> i) [2,2,2] []
但如果我尝试这样做,我会得到错误。据推测,参数列表的划分方式对函数没有意义。我花了大约半个小时的谷歌搜索和实验,试图找出 Haskell 解析此类函数字符串的机制,但我还没有找到明确的解释,理解也难以理解。所以,正式的问题:
- Haskell 如何解析 eg
f1 f2 f3 x y z
?参数是如何分配的?它是依赖于函数的签名,还是只是尝试f1
使用 5 个参数调用? - 有没有一种重组
ma
方法允许在没有括号的情况下调用它?(最多允许添加两个辅助函数,例如maStart ma ma maStop (\_ i -> i) [1,2,3,4] []
,如有必要。)