質問編集履歴

1 不要な文章を削除しました。

退会済みユーザー

退会済みユーザー

2016/06/20 09:07  投稿

IOから値を取り出したい
###前提・実現したいこと
境界条件などから粒子の加速度成分(タプル)を生成し、全粒子のリストを生成したいです。
タプルを生成し、全タプルのリストを生成したいです。
具体的には`[(0,0,0), (0,0,1), ...]`のような感じです。
まず粒子iのタプルを生成して返す関数を作りたいです。
まずタプルを生成して返す関数を作りたいです。
```
initX :: Int -> Int
initX n | n < 4    = 2
       | otherwise = 4
       
initY :: Int -> Int
initY n = 0
       
initZ :: Int -> Int
initZ n = 0
initVector :: Int -> (Int, Int, Int)
initVector n = (initX n, initY n, initZ n)
print $ initVector 3 -- (2,0,0)
```
しかし、この関数をひとつにしたいのでdoを使いました。
この関数をひとつにしたいのでdoを使いました。
```
initVectorIO :: Int -> IO (Int, Int, Int)
initVectorIO n = do
   let x | n < 4 = 2
         | otherwise = 4
   let y = 0
   let z = 0
   return (x, y, z)
```
するとIO型になるので取り出す必要がでてきました。
```
print =<< initVectorIO 3 -- (4,0,0)
```
最終的にリストを返す関数はこちらです。
```
initPosition :: Int -> [(Int, Int, Int)]
initPosition n
   | 0 < n = initPosition(n-1) ++ [initVector n]
   | 0 >= n = []
```
この`initPosition`の`initVector`の部分に`initVectorIO`を使いたいです。お願いします。
  • Haskell

    145 questions

    Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る