2016-11-13 10 views
1

このコードでループが発生する理由を説明してください。入手方法<<loop>> Haskellで例外がパターン配置によって異なります

module Main where 

import Data.List.Split 
import Data.Maybe 
import Text.Read 

main :: IO() 
main = print (snd (toInmetDate "01/02/2012")) 

type P a = (Bool, a) 

readP :: (Read a) => String -> P a 
readP text 
    | isJust value = (True, fromJust value) 
    | isNothing value = (False, read "0") 
    where value = readMaybe text 

data InmetDate = InmetDate {dia :: P Int, mes :: P Int, ano :: P Integer} 
    deriving (Show, Read) 

toInmetDate :: String -> P InmetDate 
toInmetDate x = if length l == 3 
    then (True, InmetDate (readP ds) (readP ms) (readP as)) 
    else (False, InmetDate (False, 0) (False, 0) (False, 0)) 
    where (l,ds:ms:as:_) = (splitOn "/" x, l ++ replicate 20 "NULL") 

私は私が作るとき、と述べているでしょう:完全コードワーク

where (ds:ms:as:_) = l ++ replicate 20 "NULL" 
     l = splitOn "/" x 

に等しい
where (l,ds:ms:as:_) = (splitOn "/" x, l ++ replicate 20 "NULL") 

を。

+1

最後に私が間違っていることを知ることができる理由を知っておいてください。 – RomuloPBenedetti

+1

私はdownvoteをしませんでしたが、私が不合理な気分にあった場合は、コンパイルしないでください(いくつかのインポート、テストのための 'main')が必要です。 –

+0

最近、多くのハズケルの質問にダウンボートがあるようです。たぶん誰かが不満を持ち、コミュニティーを堕落させようとしているかもしれません。 – luqui

答えて

3

オリジナルでは、lの値は、再帰的にlで定義されたタプルに依存します。この変更では、lは値splitOn "/" xにのみ依存します。

+2

タプルの2番目の要素のパターンマッチングの厳密さは、多くの混乱を引き起こす可能性があります。たとえば、明示的な怠惰は 'どこで(l、〜(ds:ms:as:_))=(splitOn"/"x、l ++複製20" NULL ")' –

+0

厳密性についてもう少し調べた後、最後にそれを理解しました。私はhaskellを 'non-strict'言語の代わりに' lazy'と誤解しました。 – RomuloPBenedetti

+1

@RomuloPBenedetti、私はあなたが満足してうれしいですが、私はあなたがおそらくそれを理解していないことを指摘する必要があるように感じます。 * lazy *と* non-strict *は、あなたが得る出力とまったく同じものを意味します(重要ではない[微妙な区別](http://stackoverflow.com/a/7141537/33796))ここに)。私はトーマスが正しいと思います、これはパターンマッチの厳密さです。 – luqui

関連する問題