2016-06-13 6 views
0
{-# LANGUAGE ScopedTypeVariables #-} 

module Main where 
    import Control.Applicative ((<$>)) 
    import Data.ByteString (ByteString) 
    import qualified Data.ByteString as B 
    import qualified Data.ByteString.Char8 as C 
    import qualified Data.Vector.Unboxed as V 
    import qualified Data.Vector as VB 
    import qualified Data.List as L 

    (|>) :: a -> (a -> b) -> b 
    x |> f = f x 

    main :: IO() 
    main = 
    let 
     parse (s :: ByteString) = s |> L.unfoldr (C.readInt . C.dropWhile (== ' ')) 
     solve (l :: Int) (ars :: VB.Vector ByteString) = 
      let 
       (n :: V.Vector (Int, Int)) = V.fromList [(x,y) | x <- [0..l-1], y <- [x+1..l-1]] 
      in 
       n 
    in do 
     [n,l :: Int] <- parse <$> B.getLine 
     (ars :: VB.Vector ByteString) <- VB.replicateM n B.getLine 
     ars 
     |> solve l 
     |> print 

コンパイラはlが何らかの理由で有効範囲に含まれていないと訴えています。何故ですか?私はちょうどScopedTypeVariables拡張子が何を考え出したのでハスケルでは、この例では|>演算子が範囲外のエラーを出すのはなぜですか?

Not in scope: `l' 

また、コードはそのように見える理由があります。それは適切な言語で、初心者のチュートリアルでなければなりません。私は過去数週間に渡って痛みを救ったでしょう。

+0

。あなたがテストしている実際のプログラムとコンパイラのエラーを正確に伝えることができますか? – pdexter

+0

申し訳ありません。私は例を編集して、エラーがトリガするようにしました。また、 'ars |> solve l |> print'を1行に書くと、この例がうまくいくようです。 –

+0

たとえば、まだインポートが行方不明です。 – pdexter

答えて

1

インデントが間違っています。次のいずれかの作業。

{-# LANGUAGE ScopedTypeVariables #-} 
import Data.ByteString as B 
import qualified Data.Vector.Unboxed as V 
import qualified Data.Vector as VB 
import Data.List as L 
import Data.ByteString.Char8 as C 

(|>) :: a -> (a -> b) -> b 
x |> f = f x 

main :: IO() 
main = 
    let 
    parse (s :: ByteString) = s |> L.unfoldr (C.readInt . C.dropWhile (== ' ')) 
    solve (l :: Int) (ars :: VB.Vector ByteString) = 
     let 
     (n :: V.Vector (Int, Int)) = V.fromList [(x,y) | x <- [0..l-1], y <- [x+1..l-1]] 
     in 
     n 
    in do 
    [n,l :: Int] <- parse <$> B.getLine 
    (ars :: VB.Vector ByteString) <- VB.replicateM n B.getLine 
    ars |> solve l |> print 

- 私が取得エラーではありません

{-# LANGUAGE ScopedTypeVariables #-} 
import Data.ByteString as B 
import qualified Data.Vector.Unboxed as V 
import qualified Data.Vector as VB 
import Data.List as L 
import Data.ByteString.Char8 as C 

(|>) :: a -> (a -> b) -> b 
x |> f = f x 

main :: IO() 
main = 
    let 
    parse (s :: ByteString) = s |> L.unfoldr (C.readInt . C.dropWhile (== ' ')) 
    solve (l :: Int) (ars :: VB.Vector ByteString) = 
     let 
     (n :: V.Vector (Int, Int)) = V.fromList [(x,y) | x <- [0..l-1], y <- [x+1..l-1]] 
     in 
     n 
    in do 
    [n,l :: Int] <- parse <$> B.getLine 
    (ars :: VB.Vector ByteString) <- VB.replicateM n B.getLine 
    ars |> 
     solve l |> 
     print 
+0

ええ、申し訳ありませんが、編集をご覧ください。 'ars |> solve l |> print'は3行でなければなりません。私は誤って正しいものを貼り付けました。今、私は単純なインデントの問題があることがわかります。ええ、これです。 –

関連する問題