前提・実現したいこと
Haskellで外部ファイル(txtやcsv)から数値の読み込みをしたい.
そのとき,読み込んだ値をレコード構文で作成した型を設定した変数にし,そのフィールド値を取得したい.
発生している問題・エラーメッセージ
GHCi
1*GHCi> let dt = timeSlice parametersSetting 2<interactive>:15:21: error: 3 • Couldn't match expected type ‘ParametersFromExternalFiles’ 4 with actual type ‘(Double, DensitiesOfEachLayer, ElasticCoefficients,)’ 5 • In the first argument of ‘timeSlice’, namely ‘parametersSetting’ 6 In the expression: (timeSlice parametersSetting) 7 In an equation for ‘dt’: dt = (timeSlice parametersSetting) 8
該当のソースコード
Haskell
1data ParametersFromExternalFiles = ParametersFromExternalFiles 2 { timeSlice :: Double -- 時間刻み 3 , densityOfMaterial :: DensitiesOfEachLayer -- 材料の密度 4 , elasticProperties :: ElasticCoefficients -- ポアソン比 5 } deriving(Show)
で型を定義し,
Haskell
1*GHCi> parametersFromTxt <- readFile "./scripts/parameters.txt" 2*GHCi> let parametersSetting = formatCsvToParameters (readCsv parametersFromTxt) 3-- formatCsvToParameters, readCsvは自作した読み込み用の関数(動作は確認済み) 4*GHCi> let dt = timeSlice parametersSetting
試したこと
parametersSettingの型までは確認済.
Haskell
1*GHCi> :t parametersSetting 2parametersSetting 3 :: (Double, DensitiesOfEachLayer, ElasticCoefficients)
補足情報(FW/ツールのバージョンなど)
・stack
Version 1.7.1, Git revision 681c800873816c022739ca7ed14755e85a579565 (5807 commits) x86_64 hpack-0.28.2
追加の疑問点
このとき読み込めているとしたらdtの持つ型は単に”Double”になるのですか?
formatCsvToParameters, readCsvはどんな型になってますか?型シグネチャーを省略しているのでわからないという場合、一時的に `formatCsvToParameters :: ()` など、わざと型注釈を加えてみると、正しく推論した型をGHCが教えてくれるはずです。あるいは、formatCsvToParameters, readCsvのソースコードを見せていただきたいです。
回答1件
あなたの回答
tips
プレビュー