哈斯克尔.用参数提供程序(纯粹方式)

Yro*_*irg 1 io haskell input

我对在程序中提供参数的可能方法感兴趣.这是一个物理模拟,我需要输入温度,步数等.

但是我需要这些参数是纯粹的,所以我不能以任何方式使用IO.因此,每次我的程序的至少一部分必须重新编译.实现这一目标的最佳方法是什么?

据我所知,xmonad使用相同的技术.

UPD似乎Dyre做我需要的.http://hackage.haskell.org/package/dyre试试吧.

UPD2 Dyre有点不同.

C. *_*ann 9

从对问题的评论:

我不想将它们作为参数传递给它,因为它很笨重 - 在这种情况下,所有函数都需要一个额外的参数.而且我不确定这只有几个全局函数(代表参数)的效率.

这里隐含的一些误解需要加以研究.

首先,众所周知的一个:如果你不确定效率,不要优化!首先以合理的方式编写程序,然后在需要时对其进行分析以提高速度.当您知道它将减少算法的时间或空间复杂度时,或者如果它将显着减少程序中计算密集型部分中的常数因子,则优先级优化只是一个好主意.这里也不是这样的.

其次,函数应该根据需要采用尽可能多的参数.这听起来像是重言式,它几乎是,但重点是减少传递给实际使用这些参数的函数的参数数量是没有意义的.如果它实际上没有使用某些参数,请删除它们; 如果在子表达式中一起使用参数组,则将它们作为单独的函数提取并传入结果; 如果将一堆参数一起传递给多个函数,则将它们捆绑在一个记录类型中并将其作为单个参数传递; 但是为了消除它们,不要试图消除参数.这是没有意义的!

此外,从问题本身:

但是我需要这些参数是纯粹的,所以我不能以任何方式使用IO.因此,每次我的程序的至少一部分必须重新编译.

纯参数不是.它们是不变的价值观.您可以在源代码中的其他位置定义它们,但在编译之后它们是固定且不可变的.如果程序需要访问该参数编译后更改,即具有使用I/O.这实际上就是I/O 的定义!

请记住,即使您需要在IO计算中获取值,所有实际逻辑都可以在纯函数中完成,如下所示:

main :: IO ()
main = do x <- getParameter
          let r = lotsOfCalculations x
          print r
Run Code Online (Sandbox Code Playgroud)

该函数lotsOfCalculations以及它使用的任何其他东西都是纯函数.唯一的用途IO是获取参数.

另外,为了更简洁,请注意上面的代码也可以写成main = getParameter >>= print . lotsOfCalculations.

  • @Rotsor:答案可能是"任何需要提问的人可能都不需要它".这个问题暗示了如何以简单的方式做事的误解; 解释如何以复杂的方式解决这些问题会适得其反并产生误导. (2认同)