将元组拆分为n个部分

时间:2017-10-18 20:52:42

标签: haskell

我正在尝试创建一个接收一系列双精度(Double,Double)和一个n(Int)的函数,其中我将此区间分成n个相等的部分。我知道如果它是一个列表,我在列表中做了一个Split,但是在元组中获得双打,我不知道该怎么做。 感谢您的帮助

2 个答案:

答案 0 :(得分:2)

这与@ mschmidt的答案类似,但我认为列表理解可能是最清楚的:

> intervals 4 (1,10)
[(1.0,3.25),(3.25,5.5),(5.5,7.75),(7.75,10.0)]
> 

,并提供:

intervals' :: Int -> (Double,Double) -> [(Double,Double)]
intervals' n (a,b) =
  let n' = fromIntegral n
      d = (b - a) / n'
      x = [a + i*d | i <- [0..n']]
  in zip x (tail x)

如果端点的重复计算冒犯了您,您可以写:

zip x (tail x)

请注意> let x = [1,2,3,4] in zip x (tail x) [(1,2),(2,3),(3,4)] > 是一种非常标准的方法来获取连续的列表对的元组:

Starting /Users/sgb/build-imagenes-Desktop_Qt_5_9_1_clang_64bit-
Debug/NBasic.app/Contents/MacOS/NBasic...
dyld: Symbol not found: __cg_jpeg_resync_to_restart
Referenced from: 
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Expected in: /usr/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
The program has unexpectedly finished.

答案 1 :(得分:1)

粗略草图,可能不是最优雅的解决方案:

  • 取两个输入双打(我称之为lu)并计算输入范围/间隔的宽度。
  • 您想要计算宽度为n的{​​{1}}输出范围。通过将输入宽度除以w来计算此w
  • 建立一个长度n的列表,其中包含值nl+0*wl+1*w,...
  • 通过将列表中的前两项组合成一个元组来构建输出元组列表。删除列表中的一个元素。继续,直到只剩下一个元素。
  • 尝试捕捉所有可能的错误