そのコードをLists.hsというファイルに保存したと思います
len
Hugsで関数を呼び出す方法は次のとおりです。
Main> :l Lists
Main> len Nil
0
Main> len (Cons 1 Nil)
1
Main> len (Cons 'a' Nil)
1
Main> len (Cons 'a' (Cons 'b' Nil))
2
Main> len (Cons 'a' (Cons 'b' (Cons 'c' Nil)))
3
ただし、角かっこは少し醜いです。これをより良くする方法は次のとおりです。
infixr 5 :.
data List a = Nil | a :. (List a)
deriving Show
このinfixr
行は、コンストラクターが右側に関連付けられる必要があることをHugsに伝えている:.
ため、右側に暗黙の角かっこがあります。これは、
'a' :. 'b' :. Nil = 'a' :. ('b' :. Nil)
これを入れないと、ハグは:.
左側に仲間がいると想定するので、
'a' :. 'b' :. Nil = ('a' :. 'b') :. Nil
これは意味がありません-あなたは得るでしょう
Main> 'a' :. 'b' :. Nil
ERROR - Type error in application
*** Expression : 'a' :. 'b'
*** Term : 'b'
*** Type : Char
*** Does not match : List a
またはもっと紛らわしいことに、それが数字の場合、リストから数字を作成しようとします。
Main> 1 :. 2 :. Nil
ERROR - Cannot infer instance
*** Instance : Num (List a)
*** Expression : 1 :. 2 :. Nil
とにかく、私たちはそのinfixr 5 :.
ことをしたので、それは起こりません。優先順位5を選択し:
ました。これは、標準のプレリュードにあるものだからです。len
これで、新しい定義に対応するように編集できます。
len :: List a -> Int
len Nil = 0
len (_ :. xs) = 1 + len xs
あなたが得るように
Main> len (4 :. 5 :. 6:. Nil)
3
または、必要に応じて、
Main> len $ 4 :. 5 :. 6:. Nil
3
(あなたはすることができた
infixr 5 `Cons`
代わりに、しかし私はそれがそれほど良いとは思わない。)