diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,3 @@
+# Changelog for hall-symbols
+
+## Unreleased changes
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Jun Narumi (c) 2018
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Jun Narumi nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,8 @@
+# hall-symbols
+
+Haskell Hall Symbols Library
+
+## License
+
+See the [LICENSE](https://github.com/narumij/hall-symbols/LICENSE)
+file in the repository.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/hall-symbols.cabal b/hall-symbols.cabal
new file mode 100644
--- /dev/null
+++ b/hall-symbols.cabal
@@ -0,0 +1,62 @@
+-- This file has been generated from package.yaml by hpack version 0.28.2.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: d12bbdc0541111541cff37cd9476b103519c83cb6f35480d7c6234e0e14cda37
+
+name:           hall-symbols
+version:        0.1.0.2
+synopsis:       Symmetry operations generater of Hall Symbols
+description:    Please see the README on GitHub at <https://github.com/narumij/hall-symbols#readme>
+category:       Chemistry
+homepage:       https://github.com/narumij/hall-symbols#readme
+bug-reports:    https://github.com/narumij/hall-symbols/issues
+author:         Jun Narumi
+maintainer:     narumij@gmail.com
+copyright:      Jun Narumi
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
+extra-source-files:
+    ChangeLog.md
+    README.md
+
+source-repository head
+  type: git
+  location: https://github.com/narumij/hall-symbols
+
+library
+  exposed-modules:
+      Crystallography.HallSymbols
+      Crystallography.HallSymbols.SpacegroupSymbols
+  other-modules:
+      Paths_hall_symbols
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+    , doctest
+    , matrix
+    , parsec
+  default-language: Haskell2010
+
+test-suite hall-symbols-test
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  other-modules:
+      HallSymbolsSpec
+      Paths_hall_symbols
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N
+  build-depends:
+      QuickCheck
+    , base >=4.7 && <5
+    , doctest
+    , hall-symbols
+    , hspec
+    , matrix
+    , matrix-as-xyz
+    , parsec
+  default-language: Haskell2010
diff --git a/src/Crystallography/HallSymbols.hs b/src/Crystallography/HallSymbols.hs
new file mode 100644
--- /dev/null
+++ b/src/Crystallography/HallSymbols.hs
@@ -0,0 +1,374 @@
+{- |
+Module      :  Crystallography.HallSymbols
+Copyright   :  (c) Jun Narumi 2018
+License     :  BSD3 (see the LICENSE file)
+
+Maintainer  :  narumij@gmail.com
+Stability   :  experimental
+Portability :  ?
+
+Symmetry operations generater of Hall Symbols
+
+[References]
+
+1. Concise Space-Group Symbols http://cci.lbl.gov/sginfo/hall_symbols.html , See also : https://github.com/rwgk/sginfo
+
+2. Space-Group Notation with an Explicit Origin
+   S.R. Hall; Space-Group Notation with an Explicit Origin ; Acta Cryst. (1981). A37, 517-525
+
+3. ITVB 2001 Table A1.4.2.7 Hall symbols http://cci.lbl.gov/sginfo/itvb_2001_table_a1427_hall_symbols.html
+
+-}
+module Crystallography.HallSymbols (
+  fromHallSymbols,
+  fromHallSymbols',
+  hallSymbols,
+  hallSymbols',
+  LatticeSymbol,
+  MatrixSymbol,
+  OriginShift,
+  ) where
+
+import Data.Maybe
+import Data.Char (isSpace)
+import Data.List (nub,sort,elemIndex)
+import Data.Fixed (mod')
+import Data.Ratio
+import Data.Matrix hiding (identity,matrix,(<|>))
+import qualified Data.Matrix as M (identity)
+import Text.ParserCombinators.Parsec
+import Text.ParserCombinators.Parsec.Error
+
+-- | Lattice symbol e.g. P -P I -I R A B C F
+--
+-- not suport T and S
+type LatticeSymbol = (Bool,Char)
+
+type NFold = Int
+
+-- | Matrix symbol e.g. 2 2xa 3 41 65
+data MatrixSymbol
+  = MatrixSymbol {
+    minusSign :: Bool, -- -
+    nFoldBody :: NFold, -- 1 2 3 4 6
+    nFoldSubscript :: Maybe Int, -- 1 2 3 4 5
+    nFoldDiagonal :: Maybe Char, -- ' " *
+    axisOfRotation :: Maybe Char, -- x y z
+    translationVector :: String -- abcnuvwd
+  } deriving Show
+
+-- | Origin shift e.g. (0 0 1)
+type OriginShift = (Integer,Integer,Integer)
+
+latticeSymbol :: CharParser () LatticeSymbol
+latticeSymbol = do
+  sign <- optionMaybe (oneOf "-")
+  b <- oneOf "PABCIRF" -- TとSは除外している
+  return (isJust sign,b)
+
+matrixSymbol :: CharParser () MatrixSymbol
+matrixSymbol = do
+  sign <- optionMaybe (oneOf "-")
+  b <- oneOf "12346"
+  s <- optionMaybe (oneOf "12345")
+  d <- optionMaybe (oneOf "'*\"")
+  a <- optionMaybe (oneOf "xyz")
+  t <- vectorSymbol
+  if isJust s && isJust d
+    then
+      fail "Symbols that can not coexist."
+    else
+      return $ MatrixSymbol (isJust sign) (read [b]) (read . (: []) <$> s) d a t
+
+vectorSymbol :: CharParser () String
+vectorSymbol = many (oneOf "abcnuvwd")
+
+originShift :: CharParser () OriginShift
+originShift = do
+  string "("
+  va <- integer
+  space
+  vb <- integer
+  space
+  vc <- integer
+  string ")"
+  return (va,vb,vc)
+
+integer :: CharParser () Integer
+integer = signed <|> unsigned
+  where
+    digits = many1 digit
+    signed = do
+      a <- char '-'
+      num <- digits
+      return (read $ a : num)
+    unsigned = do
+      num <- digits
+      return (read num)
+
+space' :: CharParser () Char
+space' = oneOf " _"
+
+-- | Primitive parser
+hallSymbols' :: CharParser () ( LatticeSymbol, [MatrixSymbol], OriginShift )
+hallSymbols' = do
+  l   <- latticeSymbol
+  nat <- many1 (try ms)
+  v   <- option (0,0,0) os
+  return (l, nat, v)
+  where
+    ms = do
+      space'
+      matrixSymbol
+    os = do
+      space'
+      originShift
+
+-- | Parser with convert
+hallSymbols :: CharParser () [Matrix Rational]
+hallSymbols = do
+  raw <- hallSymbols'
+  -- Step 1: Decode space-group symbols
+  -- decodeSymbols関数で省略された軸情報を復元し、seiz matrixを生成します
+  -- Step 2: Generate symmetry operators
+  -- generate関数で得られたseiz matrixをgeneratorとして、一般点を生成します
+  let equivalentPositions = generate . decodeSymbols $ raw
+  -- generate関数が計算に失敗すると空の配列を返すので、その場合パースエラーとして処理します
+  if null equivalentPositions
+    then
+      fail "something happen when decode or generate process."
+    else
+      -- 正常に終了すると、一般座標の行列を返します。
+      return equivalentPositions
+
+-- | Generate general equivalent positions by 4x4 matrix
+fromHallSymbols :: String -> Either ParseError [Matrix Rational]
+fromHallSymbols s = parse hallSymbols ("while reading " ++ show s) s
+
+-- | Generate general equivalent positions by 4x4 matrix (unsafe version)
+fromHallSymbols' :: String -> [Matrix Rational]
+fromHallSymbols' s = case fromHallSymbols s of
+  Left e -> error $ show e
+  Right mm -> mm
+
+-- パーズした簡約記号からseiz matrixを復元します
+decodeSymbols :: ( LatticeSymbol, [MatrixSymbol], OriginShift ) -> [Matrix Rational]
+decodeSymbols = constructMatrices . restoreDefaultAxis
+
+-- パーズ済みの簡約記号データからseiz matrixを復元します
+constructMatrices :: (LatticeSymbol, [MatrixSymbol], OriginShift) -> [Matrix Rational]
+-- TODO: パースの段階で生成不可能な内容ははじいているハズだが、念のために検証する
+constructMatrices (l,nat,v) = mapOriginShfit v $ lattice l ++ map matrix nat
+
+-- 簡約記号データの省略された軸情報を復元します
+restoreDefaultAxis :: (LatticeSymbol, [MatrixSymbol], OriginShift) -> (LatticeSymbol, [MatrixSymbol], OriginShift)
+restoreDefaultAxis ( l, nat, v ) = ( l, mapDA nat, v )
+
+-- 軸情報復元を配列に適用します
+mapDA :: [MatrixSymbol] -> [MatrixSymbol]
+mapDA = mapDA' 1 0
+
+-- 軸情報復元を再帰的に行います
+mapDA' :: Int -> NFold -> [MatrixSymbol] -> [MatrixSymbol]
+mapDA' _ _ [] = []
+mapDA' o p (x:xs) = da o p x : mapDA' (succ o) (nFoldBody x) xs
+
+-- Default axes
+-- 省略された軸情報復元をします
+da :: Int -> NFold -> MatrixSymbol -> MatrixSymbol
+da 0 _ _ = error "order parameter must be >1."
+
+-- 1. the first rotation has an axis direction of c
+-- 1番目の行列記号で軸省略の場合、c軸つまりzとなる
+da 1 preceded (MatrixSymbol s n1 n2 n3 Nothing v)
+  = MatrixSymbol s n1 n2 n3 (Just 'z') v
+
+-- 2. the second rotation (if N is 2) has an axis direction of
+-- 2番目の行列記号が2で軸省略の場合
+da 2 preceded (MatrixSymbol s 2 Nothing Nothing Nothing v)
+--   a   if preceded by an N of 2 or 4
+--   1番目の行列記号が2又は4ならばa軸 -> 2x
+  | preceded `elem` [2,4] = MatrixSymbol s 2 Nothing Nothing (Just 'x') v
+--   a-b if preceded by an N of 3 or 6
+--   1番目の行列記号が3又は6ならばa-b軸 -> 2'z
+  | preceded `elem` [3,6] = MatrixSymbol s 2 Nothing (Just '\'') (Just 'z') v
+
+-- 3. the third rotation (N is always 3) has an axis direction of
+-- 3番目の行列記号が3の場合、
+da 3 _ (MatrixSymbol s 3 Nothing Nothing a v)
+--   a+b+c
+--   軸はa+b+c -> 3*
+  = MatrixSymbol s 3 Nothing (Just '*') a v
+
+-- それ以外の軸省略について記載がみあたらないが、ひとまずc軸を標準としている
+da order preceded (MatrixSymbol s n1 n2 n3 Nothing v)
+  = MatrixSymbol s n1 n2 n3 (Just 'z') v
+
+-- 軸情報があれば加工せずそのまま
+da order preceded (matrixSymbol@(MatrixSymbol _ n1 _ _ _ _))
+  = matrixSymbol
+
+-- 一般点の生成
+generate :: [Matrix Rational] -> [Matrix Rational]
+generate mm = gn 0 mm mm
+
+-- 一般点生成の実行部
+--
+-- 一般点（equivalent positions）は、その名の通り掛け合わせても、
+-- 等価な位置のどこかにしかならない性質があるようで（対称性ゆえ？）、
+-- ジェネレーターとして選ばれた行列を掛け合わせて続けても、
+-- この性質をもつ組み合わせであれば、ある一定数以上、要素数が増えない.
+-- 繰り返し掛け合わせていき、要素数が増えなくなった段階で得られる行列のセットが一般点である。
+-- これを返却することでgeneratorから一般点を生成する計算は完了する。
+-- 注意点として、恒等操作が二つあるなどしただけで、計算結果が変化するようである。
+-- このため、計算に供する行列はジェネレーターの組み合わせとして正しいかどうか配慮する必要がある。
+gn :: Int -> [Matrix Rational] -> [Matrix Rational] -> [Matrix Rational]
+gn n s m | length m == length mm = m
+         -- 計算が収束しなかった場合、空の配列を返し終了する.
+         -- 既存の空間群の対称操作の生成が最大4回の繰り返しで足りるので、なんとなくで10回にしています
+         | n > 10 = []
+         | otherwise = gn (succ n) s mm
+  where
+    mm = nub . map (modulus1 . foldl1 multStd) . sequenceA $ [s,m]
+
+-- 行列の平行移動部分を配列で与えたベクトルで置き換える
+setTransform :: Matrix Rational -> [Rational] -> Matrix Rational
+setTransform m l = let t = fromList 3 1 l
+                       (a,b,c,d) = splitBlocks 3 3 m
+                   in joinBlocks (a,t,c,d)
+
+-- 対称操作の原点を移動する操作を行列のセット全体に適用する
+mapOriginShfit :: (Integer,Integer,Integer) -> [Matrix Rational] -> [Matrix Rational]
+mapOriginShfit (va,vb,vc) = map (sn va vb vc)
+  where
+    sn 0 0 0 m = m
+    sn va vb vc m = let v = [ va % 12, vb % 12, vc % 12 ]
+                        n = setTransform identity v
+                        o = setTransform identity (fmap negate v)
+                    in modulus1 $ foldl1 multStd [n,m,o]
+
+-- 行列の平行移動部分の各要素が [0,1)に収まるようにする
+modulus1 :: Real a => Matrix a -> Matrix a
+modulus1 m = let (a,b,c,d) = splitBlocks 3 3 m
+             in joinBlocks (a,fmap (`mod'` 1) b,c,d)
+
+-- 行列の回転部分の各要素を符号反転する
+ng33 :: Matrix Rational -> Matrix Rational
+ng33 m = let (a,b,c,d) = splitBlocks 3 3 m
+             in joinBlocks (negate a,b,c,d)
+
+-- 恒等操作
+identity :: Matrix Rational
+identity = M.identity 4
+
+-- 行列セットに、その回転部分の符号反転したものを付与する
+mapNg33 :: [Matrix Rational] -> [Matrix Rational]
+mapNg33 l = nub [ g m | g <- [ id, ng33 ], m <- l ]
+
+-- 対称芯
+centroSymmetric :: [Matrix Rational] -> [Matrix Rational]
+centroSymmetric = mapNg33
+
+-- 副格子に基づいた操作
+set :: [[Rational]] -> [Matrix Rational]
+set = map (setTransform identity)
+
+-- Table 1. Lattice Symbol T
+-- 副格子の行列を生成する
+lattice :: LatticeSymbol -> [Matrix Rational]
+lattice (False, l) =                  tbl1 l
+lattice ( True, l) = centroSymmetric (tbl1 l)
+
+tbl1 :: Char -> [Matrix Rational]
+tbl1 'P' = set [[ 0, 0, 0 ]]
+tbl1 'A' = set [[ 0, 0, 0 ], [   0, 1%2, 1%2 ]]
+tbl1 'B' = set [[ 0, 0, 0 ], [ 1%2,   0, 1%2 ]]
+tbl1 'C' = set [[ 0, 0, 0 ], [ 1%2, 1%2,   0 ]]
+tbl1 'I' = set [[ 0, 0, 0 ], [ 1%2, 1%2, 1%2 ]]
+tbl1 'R' = set [[ 0, 0, 0 ], [ 1%3, 2%3, 2%3 ], [ 2%3, 1%3, 1%3 ]]
+tbl1 'F' = set [[ 0, 0, 0 ], [   0, 1%2, 1%2 ], [ 1%2,   0, 1%2 ], [ 1%2, 1%2,  0 ]]
+tbl1  c  = error $ show c
+
+-- translation vector
+-- 複数のT記号を合算したベクトル
+tv :: String -> [Rational]
+tv ch | null ch        = [0,0,0]
+      | otherwise      = fmap (`mod'` 1) $ foldl1 (zipWith (+)) $ map tbl2 ch
+
+-- Table 2. Translation symbol T
+tbl2 :: Char -> [Rational]
+tbl2 'a' = [ 1%2,   0,   0 ]
+tbl2 'b' = [   0, 1%2,   0 ]
+tbl2 'c' = [   0,   0, 1%2 ]
+tbl2 'n' = [ 1%2, 1%2, 1%2 ]
+tbl2 'u' = [ 1%4,   0,   0 ]
+tbl2 'v' = [   0, 1%4,   0 ]
+tbl2 'w' = [   0,   0, 1%4 ]
+tbl2 'd' = [ 1%4, 1%4, 1%4 ]
+tbl2  c  = error $ show c
+
+-- seiz matrix
+-- generaterとなるmatrix
+matrix :: MatrixSymbol -> Matrix Rational
+matrix (MatrixSymbol False 3 (Just 1) Nothing (Just 'z') _) = setTransform matrix3z [0,0,1%3]
+matrix (MatrixSymbol False 3 (Just 2) Nothing (Just 'z') _) = setTransform matrix3z [0,0,2%3]
+matrix (MatrixSymbol False 4 (Just 1) Nothing (Just 'z') _) = setTransform matrix4z [0,0,1%4]
+matrix (MatrixSymbol False 4 (Just 3) Nothing (Just 'z') _) = setTransform matrix4z [0,0,3%4]
+matrix (MatrixSymbol False 6 (Just 1) Nothing (Just 'z') _) = setTransform matrix6z [0,0,1%6]
+matrix (MatrixSymbol False 6 (Just 2) Nothing (Just 'z') _) = setTransform matrix6z [0,0,2%6]
+matrix (MatrixSymbol False 6 (Just 4) Nothing (Just 'z') _) = setTransform matrix6z [0,0,4%6]
+matrix (MatrixSymbol False 6 (Just 5) Nothing (Just 'z') _) = setTransform matrix6z [0,0,5%6]
+matrix (MatrixSymbol s n1 n2 n3 a t) = setTransform (ng33if s $ tbl345 n1 n3 a) (tv t)
+
+ng33if flag = if flag then ng33 else id
+
+matrix3z = tbl345 3 Nothing (Just 'z')
+matrix4z = tbl345 4 Nothing (Just 'z')
+matrix6z = tbl345 6 Nothing (Just 'z')
+
+-- Rotation Table
+-- Table 3. Rotation symbol N Aforprincipal axes
+-- Table 4. Rotation symbol N a for face-diagonal axes
+-- Table 5. Rotation matrix for the body-diagonal axis
+tbl345 :: Int -> Maybe Char -> Maybe Char -> Matrix Rational
+-- table 3
+tbl345 1  Nothing     _         = fromLists [[ 1, 0, 0, 0], [ 0, 1, 0, 0], [ 0, 0, 1, 0], [ 0, 0, 0, 1]]
+-- Symbol Nx
+-- Rotation axis a
+tbl345 2  Nothing    (Just 'x') = fromLists [[ 1, 0, 0, 0], [ 0,-1, 0, 0], [ 0, 0,-1, 0], [ 0, 0, 0, 1]]
+tbl345 3  Nothing    (Just 'x') = fromLists [[ 1, 0, 0, 0], [ 0, 0,-1, 0], [ 0, 1,-1, 0], [ 0, 0, 0, 1]]
+tbl345 4  Nothing    (Just 'x') = fromLists [[ 1, 0, 0, 0], [ 0, 0,-1, 0], [ 0, 1, 0, 0], [ 0, 0, 0, 1]]
+tbl345 6  Nothing    (Just 'x') = fromLists [[ 1, 0, 0, 0], [ 0, 1,-1, 0], [ 0, 1, 0, 0], [ 0, 0, 0, 1]]
+-- Symbol Ny
+-- Rotation axis b
+tbl345 2  Nothing    (Just 'y') = fromLists [[-1, 0, 0, 0], [ 0, 1, 0, 0], [ 0, 0,-1, 0], [ 0, 0, 0, 1]]
+tbl345 3  Nothing    (Just 'y') = fromLists [[-1, 0, 1, 0], [ 0, 1, 0, 0], [-1, 0, 0, 0], [ 0, 0, 0, 1]]
+tbl345 4  Nothing    (Just 'y') = fromLists [[ 0, 0, 1, 0], [ 0, 1, 0, 0], [-1, 0, 0, 0], [ 0, 0, 0, 1]]
+tbl345 6  Nothing    (Just 'y') = fromLists [[ 0, 0, 1, 0], [ 0, 1, 0, 0], [-1, 0, 1, 0], [ 0, 0, 0, 1]]
+-- Symbol Nz
+-- Rotation axis c
+tbl345 2  Nothing    (Just 'z') = fromLists [[-1, 0, 0, 0], [ 0,-1, 0, 0], [ 0, 0, 1, 0], [ 0, 0, 0, 1]]
+tbl345 3  Nothing    (Just 'z') = fromLists [[ 0,-1, 0, 0], [ 1,-1, 0, 0], [ 0, 0, 1, 0], [ 0, 0, 0, 1]]
+tbl345 4  Nothing    (Just 'z') = fromLists [[ 0,-1, 0, 0], [ 1, 0, 0, 0], [ 0, 0, 1, 0], [ 0, 0, 0, 1]]
+tbl345 6  Nothing    (Just 'z') = fromLists [[ 1,-1, 0, 0], [ 1, 0, 0, 0], [ 0, 0, 1, 0], [ 0, 0, 0, 1]]
+-- table 4
+-- preceded Nx
+--   b-c
+tbl345 2 (Just '\'') (Just 'x') = fromLists [[-1, 0, 0, 0], [ 0, 0,-1, 0], [ 0,-1, 0, 0], [ 0, 0, 0, 1]]
+--   b+c
+tbl345 2 (Just '"')  (Just 'x') = fromLists [[-1, 0, 0, 0], [ 0, 0, 1, 0], [ 0, 1, 0, 0], [ 0, 0, 0, 1]]
+-- preceded Ny
+--   a-c
+tbl345 2 (Just '\'') (Just 'y') = fromLists [[ 0, 0,-1, 0], [ 0,-1, 0, 0], [-1, 0, 0, 0], [ 0, 0, 0, 1]]
+--   a+c
+tbl345 2 (Just '"')  (Just 'y') = fromLists [[ 0, 0, 1, 0], [ 0,-1, 0, 0], [ 1, 0, 0, 0], [ 0, 0, 0, 1]]
+-- preceded Nz
+--   a-b
+tbl345 2 (Just '\'') (Just 'z') = fromLists [[ 0,-1, 0, 0], [-1, 0, 0, 0], [ 0, 0,-1, 0], [ 0, 0, 0, 1]]
+--   a+b
+tbl345 2 (Just '"')  (Just 'z') = fromLists [[ 0, 1, 0, 0], [ 1, 0, 0, 0], [ 0, 0,-1, 0], [ 0, 0, 0, 1]]
+-- table 5
+--   a+b+c
+tbl345 3 (Just '*')   _         = fromLists [[ 0, 0, 1, 0], [ 1, 0, 0, 0], [ 0, 1, 0, 0], [ 0, 0, 0, 1]]
+-- error
+tbl345 a b            c         = error $ show (a,b,c)
diff --git a/src/Crystallography/HallSymbols/SpacegroupSymbols.hs b/src/Crystallography/HallSymbols/SpacegroupSymbols.hs
new file mode 100644
--- /dev/null
+++ b/src/Crystallography/HallSymbols/SpacegroupSymbols.hs
@@ -0,0 +1,563 @@
+{- |
+Module      :  Crystallography.HallSymbols.SpacegroupSymbols
+Copyright   :  (c) Jun Narumi 2018
+License     :  BSD3 (see the LICENSE file)
+
+Maintainer  :  narumij@gmail.com
+Stability   :  experimental
+Portability :  ?
+
+Spacegroup Symbols
+
+[References]
+
+1. Concise Space-Group Symbols http://cci.lbl.gov/sginfo/hall_symbols.html , See also : https://github.com/rwgk/sginfo
+
+2. ITVB 2001 Table A1.4.2.7 Hall symbols http://cci.lbl.gov/sginfo/itvb_2001_table_a1427_hall_symbols.html
+
+-}
+module Crystallography.HallSymbols.SpacegroupSymbols (
+  spacegroupSymbols,
+  NumberAndChoice,
+  HMFull,
+  HallName
+  ) where
+
+type NumberAndChoice = String
+type HMFull = String
+type HallName = String
+
+-- | Table 6. Concise space-group symbols
+spacegroupSymbols :: [(NumberAndChoice,HMFull,HallName)]
+spacegroupSymbols = [
+  (  "1",  "P 1",  "P 1"  ),
+  (  "2",  "P -1",  "-P 1"  ),
+  (  "3:b",  "P 1 2 1",  "P 2y"  ),
+  (  "3:c",  "P 1 1 2",  "P 2"  ),
+  (  "3:a",  "P 2 1 1",  "P 2x"  ),
+  (  "4:b",  "P 1 21 1",  "P 2yb"  ),
+  (  "4:c",  "P 1 1 21",  "P 2c"  ),
+  (  "4:a",  "P 21 1 1",  "P 2xa"  ),
+  (  "5:b1",  "C 1 2 1",  "C 2y"  ),
+  (  "5:b2",  "A 1 2 1",  "A 2y"  ),
+  (  "5:b3",  "I 1 2 1",  "I 2y"  ),
+  (  "5:c1",  "A 1 1 2",  "A 2"  ),
+  (  "5:c2",  "B 1 1 2",  "B 2"  ),
+  (  "5:c3",  "I 1 1 2",  "I 2"  ),
+  (  "5:a1",  "B 2 1 1",  "B 2x"  ),
+  (  "5:a2",  "C 2 1 1",  "C 2x"  ),
+  (  "5:a3",  "I 2 1 1",  "I 2x"  ),
+  (  "6:b",  "P 1 m 1",  "P -2y"  ),
+  (  "6:c",  "P 1 1 m",  "P -2"  ),
+  (  "6:a",  "P m 1 1",  "P -2x"  ),
+  (  "7:b1",  "P 1 c 1",  "P -2yc"  ),
+  (  "7:b2",  "P 1 n 1",  "P -2yac"  ),
+  (  "7:b3",  "P 1 a 1",  "P -2ya"  ),
+  (  "7:c1",  "P 1 1 a",  "P -2a"  ),
+  (  "7:c2",  "P 1 1 n",  "P -2ab"  ),
+  (  "7:c3",  "P 1 1 b",  "P -2b"  ),
+  (  "7:a1",  "P b 1 1",  "P -2xb"  ),
+  (  "7:a2",  "P n 1 1",  "P -2xbc"  ),
+  (  "7:a3",  "P c 1 1",  "P -2xc"  ),
+  (  "8:b1",  "C 1 m 1",  "C -2y"  ),
+  (  "8:b2",  "A 1 m 1",  "A -2y"  ),
+  (  "8:b3",  "I 1 m 1",  "I -2y"  ),
+  (  "8:c1",  "A 1 1 m",  "A -2"  ),
+  (  "8:c2",  "B 1 1 m",  "B -2"  ),
+  (  "8:c3",  "I 1 1 m",  "I -2"  ),
+  (  "8:a1",  "B m 1 1",  "B -2x"  ),
+  (  "8:a2",  "C m 1 1",  "C -2x"  ),
+  (  "8:a3",  "I m 1 1",  "I -2x"  ),
+  (  "9:b1",  "C 1 c 1",  "C -2yc"  ),
+  (  "9:b2",  "A 1 n 1",  "A -2yac"  ),
+  (  "9:b3",  "I 1 a 1",  "I -2ya"  ),
+  (  "9:-b1",  "A 1 a 1",  "A -2ya"  ),
+  (  "9:-b2",  "C 1 n 1",  "C -2ybc"  ),
+  (  "9:-b3",  "I 1 c 1",  "I -2yc"  ),
+  (  "9:c1",  "A 1 1 a",  "A -2a"  ),
+  (  "9:c2",  "B 1 1 n",  "B -2bc"  ),
+  (  "9:c3",  "I 1 1 b",  "I -2b"  ),
+  (  "9:-c1",  "B 1 1 b",  "B -2b"  ),
+  (  "9:-c2",  "A 1 1 n",  "A -2ac"  ),
+  (  "9:-c3",  "I 1 1 a",  "I -2a"  ),
+  (  "9:a1",  "B b 1 1",  "B -2xb"  ),
+  (  "9:a2",  "C n 1 1",  "C -2xbc"  ),
+  (  "9:a3",  "I c 1 1",  "I -2xc"  ),
+  (  "9:-a1",  "C c 1 1",  "C -2xc"  ),
+  (  "9:-a2",  "B n 1 1",  "B -2xbc"  ),
+  (  "9:-a3",  "I b 1 1",  "I -2xb"  ),
+  (  "10:b",  "P 1 2/m 1",  "-P 2y"  ),
+  (  "10:c",  "P 1 1 2/m",  "-P 2"  ),
+  (  "10:a",  "P 2/m 1 1",  "-P 2x"  ),
+  (  "11:b",  "P 1 21/m 1",  "-P 2yb"  ),
+  (  "11:c",  "P 1 1 21/m",  "-P 2c"  ),
+  (  "11:a",  "P 21/m 1 1",  "-P 2xa"  ),
+  (  "12:b1",  "C 1 2/m 1",  "-C 2y"  ),
+  (  "12:b2",  "A 1 2/m 1",  "-A 2y"  ),
+  (  "12:b3",  "I 1 2/m 1",  "-I 2y"  ),
+  (  "12:c1",  "A 1 1 2/m",  "-A 2"  ),
+  (  "12:c2",  "B 1 1 2/m",  "-B 2"  ),
+  (  "12:c3",  "I 1 1 2/m",  "-I 2"  ),
+  (  "12:a1",  "B 2/m 1 1",  "-B 2x"  ),
+  (  "12:a2",  "C 2/m 1 1",  "-C 2x"  ),
+  (  "12:a3",  "I 2/m 1 1",  "-I 2x"  ),
+  (  "13:b1",  "P 1 2/c 1",  "-P 2yc"  ),
+  (  "13:b2",  "P 1 2/n 1",  "-P 2yac"  ),
+  (  "13:b3",  "P 1 2/a 1",  "-P 2ya"  ),
+  (  "13:c1",  "P 1 1 2/a",  "-P 2a"  ),
+  (  "13:c2",  "P 1 1 2/n",  "-P 2ab"  ),
+  (  "13:c3",  "P 1 1 2/b",  "-P 2b"  ),
+  (  "13:a1",  "P 2/b 1 1",  "-P 2xb"  ),
+  (  "13:a2",  "P 2/n 1 1",  "-P 2xbc"  ),
+  (  "13:a3",  "P 2/c 1 1",  "-P 2xc"  ),
+  (  "14:b1",  "P 1 21/c 1",  "-P 2ybc"  ),
+  (  "14:b2",  "P 1 21/n 1",  "-P 2yn"  ),
+  (  "14:b3",  "P 1 21/a 1",  "-P 2yab"  ),
+  (  "14:c1",  "P 1 1 21/a",  "-P 2ac"  ),
+  (  "14:c2",  "P 1 1 21/n",  "-P 2n"  ),
+  (  "14:c3",  "P 1 1 21/b",  "-P 2bc"  ),
+  (  "14:a1",  "P 21/b 1 1",  "-P 2xab"  ),
+  (  "14:a2",  "P 21/n 1 1",  "-P 2xn"  ),
+  (  "14:a3",  "P 21/c 1 1",  "-P 2xac"  ),
+  (  "15:b1",  "C 1 2/c 1",  "-C 2yc"  ),
+  (  "15:b2",  "A 1 2/n 1",  "-A 2yac"  ),
+  (  "15:b3",  "I 1 2/a 1",  "-I 2ya"  ),
+  (  "15:-b1",  "A 1 2/a 1",  "-A 2ya"  ),
+  (  "15:-b2",  "C 1 2/n 1",  "-C 2ybc"  ),
+  (  "15:-b3",  "I 1 2/c 1",  "-I 2yc"  ),
+  (  "15:c1",  "A 1 1 2/a",  "-A 2a"  ),
+  (  "15:c2",  "B 1 1 2/n",  "-B 2bc"  ),
+  (  "15:c3",  "I 1 1 2/b",  "-I 2b"  ),
+  (  "15:-c1",  "B 1 1 2/b",  "-B 2b"  ),
+  (  "15:-c2",  "A 1 1 2/n",  "-A 2ac"  ),
+  (  "15:-c3",  "I 1 1 2/a",  "-I 2a"  ),
+  (  "15:a1",  "B 2/b 1 1",  "-B 2xb"  ),
+  (  "15:a2",  "C 2/n 1 1",  "-C 2xbc"  ),
+  (  "15:a3",  "I 2/c 1 1",  "-I 2xc"  ),
+  (  "15:-a1",  "C 2/c 1 1",  "-C 2xc"  ),
+  (  "15:-a2",  "B 2/n 1 1",  "-B 2xbc"  ),
+  (  "15:-a3",  "I 2/b 1 1",  "-I 2xb"  ),
+  (  "16",  "P 2 2 2",  "P 2 2"  ),
+  (  "17",  "P 2 2 21",  "P 2c 2"  ),
+  (  "17:cab",  "P 21 2 2",  "P 2a 2a"  ),
+  (  "17:bca",  "P 2 21 2",  "P 2 2b"  ),
+  (  "18",  "P 21 21 2",  "P 2 2ab"  ),
+  (  "18:cab",  "P 2 21 21",  "P 2bc 2"  ),
+  (  "18:bca",  "P 21 2 21",  "P 2ac 2ac"  ),
+  (  "19",  "P 21 21 21",  "P 2ac 2ab"  ),
+  (  "20",  "C 2 2 21",  "C 2c 2"  ),
+  (  "20:cab",  "A 21 2 2",  "A 2a 2a"  ),
+  (  "20:bca",  "B 2 21 2",  "B 2 2b"  ),
+  (  "21",  "C 2 2 2",  "C 2 2"  ),
+  (  "21:cab",  "A 2 2 2",  "A 2 2"  ),
+  (  "21:bca",  "B 2 2 2",  "B 2 2"  ),
+  (  "22",  "F 2 2 2",  "F 2 2"  ),
+  (  "23",  "I 2 2 2",  "I 2 2"  ),
+  (  "24",  "I 21 21 21",  "I 2b 2c"  ),
+  (  "25",  "P m m 2",  "P 2 -2"  ),
+  (  "25:cab",  "P 2 m m",  "P -2 2"  ),
+  (  "25:bca",  "P m 2 m",  "P -2 -2"  ),
+  (  "26",  "P m c 21",  "P 2c -2"  ),
+  (  "26:ba-c",  "P c m 21",  "P 2c -2c"  ),
+  (  "26:cab",  "P 21 m a",  "P -2a 2a"  ),
+  (  "26:-cba",  "P 21 a m",  "P -2 2a"  ),
+  (  "26:bca",  "P b 21 m",  "P -2 -2b"  ),
+  (  "26:a-cb",  "P m 21 b",  "P -2b -2"  ),
+  (  "27",  "P c c 2",  "P 2 -2c"  ),
+  (  "27:cab",  "P 2 a a",  "P -2a 2"  ),
+  (  "27:bca",  "P b 2 b",  "P -2b -2b"  ),
+  (  "28",  "P m a 2",  "P 2 -2a"  ),
+  (  "28:ba-c",  "P b m 2",  "P 2 -2b"  ),
+  (  "28:cab",  "P 2 m b",  "P -2b 2"  ),
+  (  "28:-cba",  "P 2 c m",  "P -2c 2"  ),
+  (  "28:bca",  "P c 2 m",  "P -2c -2c"  ),
+  (  "28:a-c",  "b   P m 2 a",  "P -2a -2a"  ),
+  (  "29",  "P c a 21",  "P 2c -2ac"  ),
+  (  "29:ba-c",  "P b c 21",  "P 2c -2b"  ),
+  (  "29:cab",  "P 21 a b",  "P -2b 2a"  ),
+  (  "29:-cba",  "P 21 c a",  "P -2ac 2a"  ),
+  (  "29:bca",  "P c 21 b",  "P -2bc -2c"  ),
+  (  "29:a-cb",  "P b 21 a",  "P -2a -2ab"  ),
+  (  "30",  "P n c 2",  "P 2 -2bc"  ),
+  (  "30:ba-c",  "P c n 2",  "P 2 -2ac"  ),
+  (  "30:cab",  "P 2 n a",  "P -2ac 2"  ),
+  (  "30:-cba",  "P 2 a n",  "P -2ab 2"  ),
+  (  "30:bca",  "P b 2 n",  "P -2ab -2ab"  ),
+  (  "30:a-cb",  "P n 2 b",  "P -2bc -2bc"  ),
+  (  "31",  "P m n 21",  "P 2ac -2"  ),
+  (  "31:ba-c",  "P n m 21",  "P 2bc -2bc"  ),
+  (  "31:cab",  "P 21 m n",  "P -2ab 2ab"  ),
+  (  "31:-cba",  "P 21 n m",  "P -2 2ac"  ),
+  (  "31:bca",  "P n 21 m",  "P -2 -2bc"  ),
+  (  "31:a-cb",  "P m 21 n",  "P -2ab -2"  ),
+  (  "32",  "P b a 2",  "P 2 -2ab"  ),
+  (  "32:cab",  "P 2 c b",  "P -2bc 2"  ),
+  (  "32:bca",  "P c 2 a",  "P -2ac -2ac"  ),
+  (  "33",  "P n a 21",  "P 2c -2n"  ),
+  (  "33:ba-c",  "P b n 21",  "P 2c -2ab"  ),
+  (  "33:cab",  "P 21 n b",  "P -2bc 2a"  ),
+  (  "33:-cba",  "P 21 c n",  "P -2n 2a"  ),
+  (  "33:bca",  "P c 21 n",  "P -2n -2ac"  ),
+  (  "33:a-cb",  "P n 21 a",  "P -2ac -2n"  ),
+  (  "34",  "P n n 2",  "P 2 -2n"  ),
+  (  "34:cab",  "P 2 n n",  "P -2n 2"  ),
+  (  "34:bca",  "P n 2 n",  "P -2n -2n"  ),
+  (  "35",  "C m m 2",  "C 2 -2"  ),
+  (  "35:cab",  "A 2 m m",  "A -2 2"  ),
+  (  "35:bca",  "B m 2 m",  "B -2 -2"  ),
+  (  "36",  "C m c 21",  "C 2c -2"  ),
+  (  "36:ba-c",  "C c m 21",  "C 2c -2c"  ),
+  (  "36:cab",  "A 21 m a",  "A -2a 2a"  ),
+  (  "36:-cba",  "A 21 a m",  "A -2 2a"  ),
+  (  "36:bca",  "B b 21 m",  "B -2 -2b"  ),
+  (  "36:a-cb",  "B m 21 b",  "B -2b -2"  ),
+  (  "37",  "C c c 2",  "C 2 -2c"  ),
+  (  "37:cab",  "A 2 a a",  "A -2a 2"  ),
+  (  "37:bca",  "B b 2 b",  "B -2b -2b"  ),
+  (  "38",  "A m m 2",  "A 2 -2"  ),
+  (  "38:ba-c",  "B m m 2",  "B 2 -2"  ),
+  (  "38:cab",  "B 2 m m",  "B -2 2"  ),
+  (  "38:-cba",  "C 2 m m",  "C -2 2"  ),
+  (  "38:bca",  "C m 2 m",  "C -2 -2"  ),
+  (  "38:a-cb",  "A m 2 m",  "A -2 -2"  ),
+  (  "39",  "A b m 2",  "A 2 -2c"  ),
+  (  "39:ba-c",  "B m a 2",  "B 2 -2c"  ),
+  (  "39:cab",  "B 2 c m",  "B -2c 2"  ),
+  (  "39:-cba",  "C 2 m b",  "C -2b 2"  ),
+  (  "39:bca",  "C m 2 a",  "C -2b -2b"  ),
+  (  "39:a-cb",  "A c 2 m",  "A -2c -2c"  ),
+  (  "40",  "A m a 2",  "A 2 -2a"  ),
+  (  "40:ba-c",  "B b m 2",  "B 2 -2b"  ),
+  (  "40:cab",  "B 2 m b",  "B -2b 2"  ),
+  (  "40:-cba",  "C 2 c m",  "C -2c 2"  ),
+  (  "40:bca",  "C c 2 m",  "C -2c -2c"  ),
+  (  "40:a-cb",  "A m 2 a",  "A -2a -2a"  ),
+  (  "41",  "A b a 2",  "A 2 -2ac"  ),
+  (  "41:ba-c",  "B b a 2",  "B 2 -2bc"  ),
+  (  "41:cab",  "B 2 c b",  "B -2bc 2"  ),
+  (  "41:-cba",  "C 2 c b",  "C -2bc 2"  ),
+  (  "41:bca",  "C c 2 a",  "C -2bc -2bc"  ),
+  (  "41:a-cb",  "A c 2 a",  "A -2ac -2ac"  ),
+  (  "42",  "F m m 2",  "F 2 -2"  ),
+  (  "42:cab",  "F 2 m m",  "F -2 2"  ),
+  (  "42:bca",  "F m 2 m",  "F -2 -2"  ),
+  (  "43",  "F d d 2",  "F 2 -2d"  ),
+  (  "43:cab",  "F 2 d d",  "F -2d 2"  ),
+  (  "43:bca",  "F d 2 d",  "F -2d -2d"  ),
+  (  "44",  "I m m 2",  "I 2 -2"  ),
+  (  "44:cab",  "I 2 m m",  "I -2 2"  ),
+  (  "44:bca",  "I m 2 m",  "I -2 -2"  ),
+  (  "45",  "I b a 2",  "I 2 -2c"  ),
+  (  "45:cab",  "I 2 c b",  "I -2a 2"  ),
+  (  "45:bca",  "I c 2 a",  "I -2b -2b"  ),
+  (  "46",  "I m a 2",  "I 2 -2a"  ),
+  (  "46:ba-c",  "I b m 2",  "I 2 -2b"  ),
+  (  "46:cab",  "I 2 m b",  "I -2b 2"  ),
+  (  "46:-cba",  "I 2 c m",  "I -2c 2"  ),
+  (  "46:bca",  "I c 2 m",  "I -2c -2c"  ),
+  (  "46:a-cb",  "I m 2 a",  "I -2a -2a"  ),
+  (  "47",  "P m m m",  "-P 2 2"  ),
+  (  "48:1",  "P n n n:1",  "P 2 2 -1n"  ),
+  (  "48:2",  "P n n n:2",  "-P 2ab 2bc"  ),
+  (  "49",  "P c c m",  "-P 2 2c"  ),
+  (  "49:cab",  "P m a a",  "-P 2a 2"  ),
+  (  "49:bca",  "P b m b",  "-P 2b 2b"  ),
+  (  "50:1",  "P b a n:1",  "P 2 2 -1ab"  ),
+  (  "50:2",  "P b a n:2",  "-P 2ab 2b"  ),
+  (  "50:1cab",  "P n c b:1",  "P 2 2 -1bc"  ),
+  (  "50:2cab",  "P n c b:2",  "-P 2b 2bc"  ),
+  (  "50:1bca",  "P c n a:1",  "P 2 2 -1ac"  ),
+  (  "50:2bca",  "P c n a:2",  "-P 2a 2c"  ),
+  (  "51",  "P m m a",  "-P 2a 2a"  ),
+  (  "51:ba-c",  "P m m b",  "-P 2b 2"  ),
+  (  "51:cab",  "P b m m",  "-P 2 2b"  ),
+  (  "51:-cba",  "P c m m",  "-P 2c 2c"  ),
+  (  "51:bca",  "P m c m",  "-P 2c 2"  ),
+  (  "51:a-cb",  "P m a m",  "-P 2 2a"  ),
+  (  "52",  "P n n a",  "-P 2a 2bc"  ),
+  (  "52:ba-c",  "P n n b",  "-P 2b 2n"  ),
+  (  "52:cab",  "P b n n",  "-P 2n 2b"  ),
+  (  "52:-cba",  "P c n n",  "-P 2ab 2c"  ),
+  (  "52:bca",  "P n c n",  "-P 2ab 2n"  ),
+  (  "52:a-cb",  "P n a n",  "-P 2n 2bc"  ),
+  (  "53",  "P m n a",  "-P 2ac 2"  ),
+  (  "53:ba-c",  "P n m b",  "-P 2bc 2bc"  ),
+  (  "53:cab",  "P b m n",  "-P 2ab 2ab"  ),
+  (  "53:-cba",  "P c n m",  "-P 2 2ac"  ),
+  (  "53:bca",  "P n c m",  "-P 2 2bc"  ),
+  (  "53:a-cb",  "P m a n",  "-P 2ab 2"  ),
+  (  "54",  "P c c a",  "-P 2a 2ac"  ),
+  (  "54:ba-c",  "P c c b",  "-P 2b 2c"  ),
+  (  "54:cab",  "P b a a",  "-P 2a 2b"  ),
+  (  "54:-cba",  "P c a a",  "-P 2ac 2c"  ),
+  (  "54:bca",  "P b c b",  "-P 2bc 2b"  ),
+  (  "54:a-cb",  "P b a b",  "-P 2b 2ab"  ),
+  (  "55",  "P b a m",  "-P 2 2ab"  ),
+  (  "55:cab",  "P m c b",  "-P 2bc 2"  ),
+  (  "55:bca",  "P c m a",  "-P 2ac 2ac"  ),
+  (  "56",  "P c c n",  "-P 2ab 2ac"  ),
+  (  "56:cab",  "P n a a",  "-P 2ac 2bc"  ),
+  (  "56:bca",  "P b n b",  "-P 2bc 2ab"  ),
+  (  "57",  "P b c m",  "-P 2c 2b"  ),
+  (  "57:ba-c",  "P c a m",  "-P 2c 2ac"  ),
+  (  "57:cab",  "P m c a",  "-P 2ac 2a"  ),
+  (  "57:-cba",  "P m a b",  "-P 2b 2a"  ),
+  (  "57:bca",  "P b m a",  "-P 2a 2ab"  ),
+  (  "57:a-cb",  "P c m b",  "-P 2bc 2c"  ),
+  (  "58",  "P n n m",  "-P 2 2n"  ),
+  (  "58:cab",  "P m n n",  "-P 2n 2"  ),
+  (  "58:bca",  "P n m n",  "-P 2n 2n"  ),
+  (  "59:1",  "P m m n:1",  "P 2 2ab -1ab"  ),
+  (  "59:2",  "P m m n:2",  "-P 2ab 2a"  ),
+  (  "59:1cab",  "P n m m:1",  "P 2bc 2 -1bc"  ),
+  (  "59:2cab",  "P n m m:2",  "-P 2c 2bc"  ),
+  (  "59:1bca",  "P m n m:1",  "P 2ac 2ac -1ac"  ),
+  (  "59:2bca",  "P m n m:2",  "-P 2c 2a"  ),
+  (  "60",  "P b c n",  "-P 2n 2ab"  ),
+  (  "60:ba-c",  "P c a n",  "-P 2n 2c"  ),
+  (  "60:cab",  "P n c a",  "-P 2a 2n"  ),
+  (  "60:-cba",  "P n a b",  "-P 2bc 2n"  ),
+  (  "60:bca",  "P b n a",  "-P 2ac 2b"  ),
+  (  "60:a-cb",  "P c n b",  "-P 2b 2ac"  ),
+  (  "61",  "P b c a",  "-P 2ac 2ab"  ),
+  (  "61:ba-c",  "P c a b",  "-P 2bc 2ac"  ),
+  (  "62",  "P n m a",  "-P 2ac 2n"  ),
+  (  "62:ba-c",  "P m n b",  "-P 2bc 2a"  ),
+  (  "62:cab",  "P b n m",  "-P 2c 2ab"  ),
+  (  "62:-cba",  "P c m n",  "-P 2n 2ac"  ),
+  (  "62:bca",  "P m c n",  "-P 2n 2a"  ),
+  (  "62:a-cb",  "P n a m",  "-P 2c 2n"  ),
+  (  "63",  "C m c m",  "-C 2c 2"  ),
+  (  "63:ba-c",  "C c m m",  "-C 2c 2c"  ),
+  (  "63:cab",  "A m m a",  "-A 2a 2a"  ),
+  (  "63:-cba",  "A m a m",  "-A 2 2a"  ),
+  (  "63:bca",  "B b m m",  "-B 2 2b"  ),
+  (  "63:a-cb",  "B m m b",  "-B 2b 2"  ),
+  (  "64",  "C m c a",  "-C 2bc 2"  ),
+  (  "64:ba-c",  "C c m b",  "-C 2bc 2bc"  ),
+  (  "64:cab",  "A b m a",  "-A 2ac 2ac"  ),
+  (  "64:-cba",  "A c a m",  "-A 2 2ac"  ),
+  (  "64:bca",  "B b c m",  "-B 2 2bc"  ),
+  (  "64:a-cb",  "B m a b",  "-B 2bc 2"  ),
+  (  "65",  "C m m m",  "-C 2 2"  ),
+  (  "65:cab",  "A m m m",  "-A 2 2"  ),
+  (  "65:bca",  "B m m m",  "-B 2 2"  ),
+  (  "66",  "C c c m",  "-C 2 2c"  ),
+  (  "66:cab",  "A m a a",  "-A 2a 2"  ),
+  (  "66:bca",  "B b m b",  "-B 2b 2b"  ),
+  (  "67",  "C m m a",  "-C 2b 2"  ),
+  (  "67:ba-c",  "C m m b",  "-C 2b 2b"  ),
+  (  "67:cab",  "A b m m",  "-A 2c 2c"  ),
+  (  "67:-cba",  "A c m m",  "-A 2 2c"  ),
+  (  "67:bca",  "B m c m",  "-B 2 2c"  ),
+  (  "67:a-cb",  "B m a m",  "-B 2c 2"  ),
+  (  "68:1",  "C c c a:1",  "C 2 2 -1bc"  ),
+  (  "68:2",  "C c c a:2",  "-C 2b 2bc"  ),
+  (  "68:1ba-c",  "C c c b:1",  "C 2 2 -1bc"  ),
+  (  "68:2ba-c",  "C c c b:2",  "-C 2b 2c"  ),
+  (  "68:1cab",  "A b a a:1",  "A 2 2 -1ac"  ),
+  (  "68:2cab",  "A b a a:2",  "-A 2a 2c"  ),
+  (  "68:1-cba",  "A c a a:1",  "A 2 2 -1ac"  ),
+  (  "68:2-cba",  "A c a a:2",  "-A 2ac 2c"  ),
+  (  "68:1bca",  "B b c b:1",  "B 2 2 -1bc"  ),
+  (  "68:2bca",  "B b c b:2",  "-B 2bc 2b"  ),
+  (  "68:1a-cb",  "B b a b:1",  "B 2 2 -1bc"  ),
+  (  "68:2a-cb",  "B b a b:2",  "-B 2b 2bc"  ),
+  (  "69",  "F m m m",  "-F 2 2"  ),
+  (  "70:1",  "F d d d:1",  "F 2 2 -1d"  ),
+  (  "70:2",  "F d d d:2",  "-F 2uv 2vw"  ),
+  (  "71",  "I m m m",  "-I 2 2"  ),
+  (  "72",  "I b a m",  "-I 2 2c"  ),
+  (  "72:cab",  "I m c b",  "-I 2a 2"  ),
+  (  "72:bca",  "I c m a",  "-I 2b 2b"  ),
+  (  "73",  "I b c a",  "-I 2b 2c"  ),
+  (  "73:ba-c",  "I c a b",  "-I 2a 2b"  ),
+  (  "74",  "I m m a",  "-I 2b 2"  ),
+  (  "74:ba-c",  "I m m b",  "-I 2a 2a"  ),
+  (  "74:cab",  "I b m m",  "-I 2c 2c"  ),
+  (  "74:-cba",  "I c m m",  "-I 2 2b"  ),
+  (  "74:bca",  "I m c m",  "-I 2 2a"  ),
+  (  "74:a-cb",  "I m a m",  "-I 2c 2"  ),
+  (  "75",  "P 4",  "P 4"  ),
+  (  "76",  "P 41",  "P 4w"  ),
+  (  "77",  "P 42",  "P 4c"  ),
+  (  "78",  "P 43",  "P 4cw"  ),
+  (  "79",  "I 4",  "I 4"  ),
+  (  "80",  "I 41",  "I 4bw"  ),
+  (  "81",  "P -4",  "P -4"  ),
+  (  "82",  "I -4",  "I -4"  ),
+  (  "83",  "P 4/m",  "-P 4"  ),
+  (  "84",  "P 42/m",  "-P 4c"  ),
+  (  "85:1",  "P 4/n:1",  "P 4ab -1ab"  ),
+  (  "85:2",  "P 4/n:2",  "-P 4a"  ),
+  (  "86:1",  "P 42/n:1",  "P 4n -1n"  ),
+  (  "86:2",  "P 42/n:2",  "-P 4bc"  ),
+  (  "87",  "I 4/m",  "-I 4"  ),
+  (  "88:1",  "I 41/a:1",  "I 4bw -1bw"  ),
+  (  "88:2",  "I 41/a:2",  "-I 4ad"  ),
+  (  "89",  "P 4 2 2",  "P 4 2"  ),
+  (  "90",  "P 42 1 2",  "P 4ab 2ab"  ),
+  (  "91",  "P 41 2 2",  "P 4w 2c"  ),
+  (  "92",  "P 41 21 2",  "P 4abw 2nw"  ),
+  (  "93",  "P 42 2 2",  "P 4c 2"  ),
+  (  "94",  "P 42 21 2",  "P 4n 2n"  ),
+  (  "95",  "P 43 2 2",  "P 4cw 2c"  ),
+  (  "96",  "P 43 21 2",  "P 4nw 2abw"  ),
+  (  "97",  "I 4 2 2",  "I 4 2"  ),
+  (  "98",  "I 41 2 2",  "I 4bw 2bw"  ),
+  (  "99",  "P 4 m m",  "P 4 -2"  ),
+  (  "100",  "P 4 b m",  "P 4 -2ab"  ),
+  (  "101",  "P 42 c m",  "P 4c -2c"  ),
+  (  "102",  "P 42 n m",  "P 4n -2n"  ),
+  (  "103",  "P 4 c c",  "P 4 -2c"  ),
+  (  "104",  "P 4 n c",  "P 4 -2n"  ),
+  (  "105",  "P 42 m c",  "P 4c -2"  ),
+  (  "106",  "P 42 b c",  "P 4c -2ab"  ),
+  (  "107",  "I 4 m m",  "I 4 -2"  ),
+  (  "108",  "I 4 c m",  "I 4 -2c"  ),
+  (  "109",  "I 41 m d",  "I 4bw -2"  ),
+  (  "110",  "I 41 c d",  "I 4bw -2c"  ),
+  (  "111",  "P -4 2 m",  "P -4 2"  ),
+  (  "112",  "P -4 2 c",  "P -4 2c"  ),
+  (  "113",  "P -4 21 m",  "P -4 2ab"  ),
+  (  "114",  "P -4 21 c",  "P -4 2n"  ),
+  (  "115",  "P -4 m 2",  "P -4 -2"  ),
+  (  "116",  "P -4 c 2",  "P -4 -2c"  ),
+  (  "117",  "P -4 b 2",  "P -4 -2ab"  ),
+  (  "118",  "P -4 n 2",  "P -4 -2n"  ),
+  (  "119",  "I -4 m 2",  "I -4 -2"  ),
+  (  "120",  "I -4 c 2",  "I -4 -2c"  ),
+  (  "121",  "I -4 2 m",  "I -4 2"  ),
+  (  "122",  "I -4 2 d",  "I -4 2bw"  ),
+  (  "123",  "P 4/m m m",  "-P 4 2"  ),
+  (  "124",  "P 4/m c c",  "-P 4 2c"  ),
+  (  "125:1",  "P 4/n b m:1",  "P 4 2 -1ab"  ),
+  (  "125:2",  "P 4/n b m:2",  "-P 4a 2b"  ),
+  (  "126:1",  "P 4/n n c:1",  "P 4 2 -1n"  ),
+  (  "126:2",  "P 4/n n c:2",  "-P 4a 2bc"  ),
+  (  "127",  "P 4/m b m",  "-P 4 2ab"  ),
+  (  "128",  "P 4/m n c",  "-P 4 2n"  ),
+  (  "129:1",  "P 4/n m m:1",  "P 4ab 2ab -1ab"  ),
+  (  "129:2",  "P 4/n m m:2",  "-P 4a 2a"  ),
+  (  "130:1",  "P 4/n c c:1",  "P 4ab 2n -1ab"  ),
+  (  "130:2",  "P 4/n c c:2",  "-P 4a 2ac"  ),
+  (  "131",  "P 42/m m c",  "-P 4c 2"  ),
+  (  "132",  "P 42/m c m",  "-P 4c 2c"  ),
+  (  "133:1",  "P 42/n b c:1",  "P 4n 2c -1n"  ),
+  (  "133:2",  "P 42/n b c:2",  "-P 4ac 2b"  ),
+  (  "134:1",  "P 42/n n m:1",  "P 4n 2 -1n"  ),
+  (  "134:2",  "P 42/n n m:2",  "-P 4ac 2bc"  ),
+  (  "135",  "P 42/m b c",  "-P 4c 2ab"  ),
+  (  "136",  "P 42/m n m",  "-P 4n 2n"  ),
+  (  "137:1",  "P 42/n m c:1",  "P 4n 2n -1n"  ),
+  (  "137:2",  "P 42/n m c:2",  "-P 4ac 2a"  ),
+  (  "138:1",  "P 42/n c m:1",  "P 4n 2ab -1n"  ),
+  (  "138:2",  "P 42/n c m:2",  "-P 4ac 2ac"  ),
+  (  "139",  "I 4/m m m",  "-I 4 2"  ),
+  (  "140",  "I 4/m c m",  "-I 4 2c"  ),
+  (  "141:1",  "I 41/a m d:1",  "I 4bw 2bw -1bw"  ),
+  (  "141:2",  "I 41/a m d:2",  "-I 4bd 2"  ),
+  (  "142:1",  "I 41/a c d:1",  "I 4bw 2aw -1bw"  ),
+  (  "142:2",  "I 41/a c d:2",  "-I 4bd 2c"  ),
+  (  "143",  "P 3",  "P 3"  ),
+  (  "144",  "P 31",  "P 31"  ),
+  (  "145",  "P 32",  "P 32"  ),
+  (  "146:H",  "R 3:H",  "R 3"  ),
+  (  "146:R",  "R 3:R",  "P 3*"  ),
+  (  "147",  "P -3",  "-P 3"  ),
+  (  "148:H",  "R -3:H",  "-R 3"  ),
+  (  "148:R",  "R -3:R",  "-P 3*"  ),
+  (  "149",  "P 3 1 2",  "P 3 2"  ),
+  (  "150",  "P 3 2 1",  "P 3 2\""  ),
+  (  "151",  "P 31 1 2",  "P 31 2c (0 0 1)"  ),
+  (  "152",  "P 31 2 1",  "P 31 2\""  ),
+  (  "153",  "P 32 1 2",  "P 32 2c (0 0 -1)"  ),
+  (  "154",  "P 32 2 1",  "P 32 2\""  ),
+  (  "155:H",  "R 32:H",  "R 3 2\""  ),
+  (  "155:R",  "R 32:R",  "P 3* 2"  ),
+  (  "156",  "P 3 m 1",  "P 3 -2\""  ),
+  (  "157",  "P 3 1 m",  "P 3 -2"  ),
+  (  "158",  "P 3 c 1",  "P 3 -2\"c"  ),
+  (  "159",  "P 3 1 c",  "P 3 -2c"  ),
+  (  "160:H",  "R 3 m:H",  "R 3 -2\""  ),
+  (  "160:R",  "R 3 m:R",  "P 3* -2"  ),
+  (  "161:H",  "R 3 c:H",  "R 3 -2\"c"  ),
+  (  "161:R",  "R 3 c:R",  "P 3* -2n"  ),
+  (  "162",  "P -3 1 m",  "-P 3 2"  ),
+  (  "163",  "P -3 1 c",  "-P 3 2c"  ),
+  (  "164",  "P -3 m 1",  "-P 3 2\""  ),
+  (  "165",  "P -3 c 1",  "-P 3 2\"c"  ),
+  (  "166:H",  "R -3 m:H",  "-R 3 2\""  ),
+  (  "166:R",  "R -3 m:R",  "-P 3* 2"  ),
+  (  "167:H",  "R -3 c:H",  "-R 3 2\"c"  ),
+  (  "167:R",  "R -3 c:R",  "-P 3* 2n"  ),
+  (  "168",  "P 6",  "P 6"  ),
+  (  "169",  "P 61",  "P 61"  ),
+  (  "170",  "P 65",  "P 65"  ),
+  (  "171",  "P 62",  "P 62"  ),
+  (  "172",  "P 64",  "P 64"  ),
+  (  "173",  "P 63",  "P 6c"  ),
+  (  "174",  "P -6",  "P -6"  ),
+  (  "175",  "P 6/m",  "-P 6"  ),
+  (  "176",  "P 63/m",  "-P 6c"  ),
+  (  "177",  "P 6 2 2",  "P 6 2"  ),
+  (  "178",  "P 61 2 2",  "P 61 2 (0 0 -1)"  ),
+  (  "179",  "P 65 2 2",  "P 65 2 (0 0 1)"  ),
+  (  "180",  "P 62 2 2",  "P 62 2c (0 0 1)"  ),
+  (  "181",  "P 64 2 2",  "P 64 2c (0 0 -1)"  ),
+  (  "182",  "P 63 2 2",  "P 6c 2c"  ),
+  (  "183",  "P 6 m m",  "P 6 -2"  ),
+  (  "184",  "P 6 c c",  "P 6 -2c"  ),
+  (  "185",  "P 63 c m",  "P 6c -2"  ),
+  (  "186",  "P 63 m c",  "P 6c -2c"  ),
+  (  "187",  "P -6 m 2",  "P -6 2"  ),
+  (  "188",  "P -6 c 2",  "P -6c 2"  ),
+  (  "189",  "P -6 2 m",  "P -6 -2"  ),
+  (  "190",  "P -6 2 c",  "P -6c -2c"  ),
+  (  "191",  "P 6/m m m",  "-P 6 2"  ),
+  (  "192",  "P 6/m c c",  "-P 6 2c"  ),
+  (  "193",  "P 63/m c m",  "-P 6c 2"  ),
+  (  "194",  "P 63/m m c",  "-P 6c 2c"  ),
+  (  "195",  "P 2 3",  "P 2 2 3"  ),
+  (  "196",  "F 2 3",  "F 2 2 3"  ),
+  (  "197",  "I 2 3",  "I 2 2 3"  ),
+  (  "198",  "P 21 3",  "P 2ac 2ab 3"  ),
+  (  "199",  "I 21 3",  "I 2b 2c 3"  ),
+  (  "200",  "P m -3",  "-P 2 2 3"  ),
+  (  "201:1",  "P n -3:1",  "P 2 2 3 -1n"  ),
+  (  "201:2",  "P n -3:2",  "-P 2ab 2bc 3"  ),
+  (  "202",  "F m -3",  "-F 2 2 3"  ),
+  (  "203:1",  "F d -3:1",  "F 2 2 3 -1d"  ),
+  (  "203:2",  "F d -3:2",  "-F 2uv 2vw 3"  ),
+  (  "204",  "I m -3",  "-I 2 2 3"  ),
+  (  "205",  "P a -3",  "-P 2ac 2ab 3"  ),
+  (  "206",  "I a -3",  "-I 2b 2c 3"  ),
+  (  "207",  "P 4 3 2",  "P 4 2 3"  ),
+  (  "208",  "P 42 3 2",  "P 4n 2 3"  ),
+  (  "209",  "F 4 3 2",  "F 4 2 3"  ),
+  (  "210",  "F 41 3 2",  "F 4d 2 3"  ),
+  (  "211",  "I 4 3 2",  "I 4 2 3"  ),
+  (  "212",  "P 43 3 2",  "P 4acd 2ab 3"  ),
+  (  "213",  "P 41 3 2",  "P 4bd 2ab 3"  ),
+  (  "214",  "I 41 3 2",  "I 4bd 2c 3"  ),
+  (  "215",  "P -4 3 m",  "P -4 2 3"  ),
+  (  "216",  "F -4 3 m",  "F -4 2 3"  ),
+  (  "217",  "I -4 3 m",  "I -4 2 3"  ),
+  (  "218",  "P -4 3 n",  "P -4n 2 3"  ),
+  (  "219",  "F -4 3 c",  "F -4c 2 3"  ),
+  (  "220",  "I -4 3 d",  "I -4bd 2c 3"  ),
+  (  "221",  "P m -3 m",  "-P 4 2 3"  ),
+  (  "222:1",  "P n -3 n:1",  "P 4 2 3 -1n"  ),
+  (  "222:2",  "P n -3 n:2",  "-P 4a 2bc 3"  ),
+  (  "223",  "P m -3 n",  "-P 4n 2 3"  ),
+  (  "224:1",  "P n -3 m:1",  "P 4n 2 3 -1n"  ),
+  (  "224:2",  "P n -3 m:2",  "-P 4bc 2bc 3"  ),
+  (  "225",  "F m -3 m",  "-F 4 2 3"  ),
+  (  "226",  "F m -3 c",  "-F 4c 2 3"  ),
+  (  "227:1",  "F d -3 m:1",  "F 4d 2 3 -1d"  ),
+  (  "227:2",  "F d -3 m:2",  "-F 4vw 2vw 3"  ),
+  (  "228:1",  "F d -3 c:1",  "F 4d 2 3 -1cd"  ),
+  (  "228:2",  "F d -3 c:2",  "-F 4cvw 2vw 3"  ),
+  (  "229",  "I m -3 m",  "-I 4 2 3"  ),
+  (  "230",  "I a -3 d",  "-I 4bd 2c 3"  )
+  ]
diff --git a/test/HallSymbolsSpec.hs b/test/HallSymbolsSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/HallSymbolsSpec.hs
@@ -0,0 +1,103 @@
+module HallSymbolsSpec where
+
+import Test.Hspec
+
+import Control.Exception (evaluate)
+import Text.ParserCombinators.Parsec
+import Crystallography.HallSymbols
+import Data.List
+import Data.Matrix
+import Data.Matrix.AsXYZ
+
+-- for check about equivalent
+sort' :: Ord a => [Matrix a] -> [[a]]
+sort' xs = sort . map toList $ xs
+
+spec :: Spec
+spec = do
+
+  describe "sort'" $ do
+
+    it "empty list is not equivalent with a 0 matrix." $ do
+      sort' [] `shouldNotBe` (sort' [zero 4 4])
+
+    it "a 1 matrix is not equivalent with a 0 matrix." $ do
+      sort' [identity 4] `shouldNotBe` (sort' [zero 4 4])
+
+    it "0 and 1 matrices is not equivalent with a 0 matrix." $ do
+      sort' [zero 4 4,identity 4] `shouldNotBe` (sort' [zero 4 4])
+
+    it "0 and 1 matrices is equivalent with 1 and 0 matrix." $ do
+      sort' [zero 4 4,identity 4] `shouldBe` (sort' [identity 4,zero 4 4])
+
+  describe "Crystallography.HallSymbols.hallSymbols" $ do
+    return ()
+
+  describe "Crystallography.HallSymbols.fromHallSymbols" $ do
+
+    it "[jpn] P 1 wo parse suru to identity ni naru" $ do
+      fromHallSymbols "P 1" `shouldBe` (Right [identity 4])
+
+    it "[jpn] P_1 wo parse suru to identity ni naru" $ do
+      fromHallSymbols "P_1" `shouldBe` (Right [identity 4])
+
+    it "[jpn] 'C -2yc' wo parse suru to 'C 1 c 1' ni naru" $ do -- 9:b1
+      sort' <$> fromHallSymbols "C -2yc"
+        `shouldBe`
+         (Right . sort' . map fromXYZ $
+         ["x,y,z", "x,-y,z+1/2", "x+1/2,y+1/2,z", "x+1/2,-y+1/2,z+1/2"])
+
+    it "[jpn] 'I 4bw 2aw -1bw' wo parse suru to 'I 41/a c d ORIGIN CHOICE 1' ni naru" $ do -- 142:1
+      sort' <$> fromHallSymbols "I 4bw 2aw -1bw"
+        `shouldBe` (Right . sort' . map fromXYZ $
+        ["x,y,z","-x+1/2,-y+1/2,z+1/2","-y,x+1/2,z+1/4","y+1/2,-x,z+3/4",
+        "-x+1/2,y,-z+1/4","x,-y+1/2,-z+3/4","y+1/2,x+1/2,-z","-y,-x,-z+1/2",
+        "-x,-y+1/2,-z+1/4","x+1/2,y,-z+3/4","y,-x,-z","-y+1/2,x+1/2,-z+1/2",
+        "x+1/2,-y+1/2,z","-x,y,z+1/2","-y+1/2,-x,z+1/4","y,x+1/2,z+3/4",
+        "x+1/2,y+1/2,z+1/2","-x,-y,z","-y+1/2,x,z+3/4","y,-x+1/2,z+1/4",
+        "-x,y+1/2,-z+3/4","x+1/2,-y,-z+1/4","y,x,-z+1/2","-y+1/2,-x+1/2,-z",
+        "-x+1/2,-y,-z+3/4","x,y+1/2,-z+1/4","y+1/2,-x+1/2,-z+1/2","-y,x,-z",
+        "x,-y,z+1/2","-x+1/2,y+1/2,z","-y,-x+1/2,z+3/4","y+1/2,x,z+1/4"])
+
+    it "[jpn] 'P 61 2 (0 0 -1)' wo parse suru to 'P 61 2 2' ni naru" $ do -- 178
+      sort' <$> fromHallSymbols "P 61 2 (0 0 -1)"
+      `shouldBe` (Right . sort' . map fromXYZ $
+      ["x,y,z","-y,x-y,z+1/3","y-x,-x,z+2/3","-x,-y,z+1/2",
+      "y,y-x,z+5/6","x-y,x,z+1/6","y,x,-z+1/3","x-y,-y,-z",
+      "-x,y-x,-z+2/3","-y,-x,-z+5/6","y-x,y,-z+1/2","x,x-y,-z+1/6"])
+
+    it "[jpn] '-I 4bd 2c 3' wo parse suru to 'I a -3 d' ni naru" $ do -- 230
+      sort' <$> fromHallSymbols "-I 4bd 2c 3"
+      `shouldBe` (Right . sort' . map fromXYZ $
+      ["x,y,z","-x+1/2,-y,z+1/2","-x,y+1/2,-z+1/2","x+1/2,-y+1/2,-z",
+      "z,x,y","z+1/2,-x+1/2,-y","-z+1/2,-x,y+1/2","-z,x+1/2,-y+1/2",
+      "y,z,x","-y,z+1/2,-x+1/2","y+1/2,-z+1/2,-x","-y+1/2,-z,x+1/2",
+      "y+3/4,x+1/4,-z+1/4","-y+3/4,-x+3/4,-z+3/4","y+1/4,-x+1/4,z+3/4","-y+1/4,x+3/4,z+1/4",
+      "x+3/4,z+1/4,-y+1/4","-x+1/4,z+3/4,y+1/4","-x+3/4,-z+3/4,-y+3/4","x+1/4,-z+1/4,y+3/4",
+      "z+3/4,y+1/4,-x+1/4","z+1/4,-y+1/4,x+3/4","-z+1/4,y+3/4,x+1/4","-z+3/4,-y+3/4,-x+3/4",
+      "-x,-y,-z","x+1/2,y,-z+1/2","x,-y+1/2,z+1/2","-x+1/2,y+1/2,z",
+      "-z,-x,-y","-z+1/2,x+1/2,y","z+1/2,x,-y+1/2","z,-x+1/2,y+1/2",
+      "-y,-z,-x","y,-z+1/2,x+1/2","-y+1/2,z+1/2,x","y+1/2,z,-x+1/2",
+      "-y+1/4,-x+3/4,z+3/4","y+1/4,x+1/4,z+1/4","-y+3/4,x+3/4,-z+1/4","y+3/4,-x+1/4,-z+3/4",
+      "-x+1/4,-z+3/4,y+3/4","x+3/4,-z+1/4,-y+3/4","x+1/4,z+1/4,y+1/4","-x+3/4,z+3/4,-y+1/4",
+      "-z+1/4,-y+3/4,x+3/4","-z+3/4,y+3/4,-x+1/4","z+3/4,-y+1/4,-x+3/4","z+1/4,y+1/4,x+1/4",
+      "x+1/2,y+1/2,z+1/2","-x,-y+1/2,z","-x+1/2,y,-z","x,-y,-z+1/2",
+      "z+1/2,x+1/2,y+1/2","z,-x,-y+1/2","-z,-x+1/2,y","-z+1/2,x,-y",
+      "y+1/2,z+1/2,x+1/2","-y+1/2,z,-x","y,-z,-x+1/2","-y,-z+1/2,x",
+      "y+1/4,x+3/4,-z+3/4","-y+1/4,-x+1/4,-z+1/4","y+3/4,-x+3/4,z+1/4","-y+3/4,x+1/4,z+3/4",
+      "x+1/4,z+3/4,-y+3/4","-x+3/4,z+1/4,y+3/4","-x+1/4,-z+1/4,-y+1/4","x+3/4,-z+3/4,y+1/4",
+      "z+1/4,y+3/4,-x+3/4","z+3/4,-y+3/4,x+1/4","-z+3/4,y+1/4,x+3/4","-z+1/4,-y+1/4,-x+1/4",
+      "-x+1/2,-y+1/2,-z+1/2","x,y+1/2,-z","x+1/2,-y,z","-x,y,z+1/2",
+      "-z+1/2,-x+1/2,-y+1/2","-z,x,y+1/2","z,x+1/2,-y","z+1/2,-x,y",
+      "-y+1/2,-z+1/2,-x+1/2","y+1/2,-z,x","-y,z,x+1/2","y,z+1/2,-x",
+      "-y+3/4,-x+1/4,z+1/4","y+3/4,x+3/4,z+3/4","-y+1/4,x+1/4,-z+3/4","y+1/4,-x+3/4,-z+1/4",
+      "-x+3/4,-z+1/4,y+1/4","x+1/4,-z+3/4,-y+1/4","x+3/4,z+3/4,y+3/4","-x+1/4,z+1/4,-y+3/4",
+      "-z+3/4,-y+1/4,x+1/4","-z+1/4,y+1/4,-x+3/4","z+1/4,-y+3/4,-x+1/4","z+3/4,y+3/4,x+3/4"])
+
+  describe "Crystallography.HallSymbols.fromHallSymbols'" $ do
+
+    it "throws an exception if used with an empty string" $ do
+      evaluate (fromHallSymbols' "") `shouldThrow` anyException
+
+    it "throws an exception if used with an wrong string" $ do
+      evaluate (fromHallSymbols' "PP") `shouldThrow` anyException
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
