1

デフォルトのライブラリ リストとして機能する、独自の多相リスト タイプ List a を作成しようとしています。コードは正しいと思いますが、Hugs98 で正常に呼び出すことができないようです。タイプ List a を使用して、関数を呼び出して空でないリストの長さをカウントする正しい方法は何でしょうか?

My Haskell Code is:
data List a = Nil | Cons a (List a)

len :: List a -> Int
len Nil = 0
len (Cons _ xs) = 1 + len xs

前もって感謝します!

4

1 に答える 1

2

そのコードをLists.hsというファイルに保存したと思います

lenHugsで関数を呼び出す方法は次のとおりです。

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`

代わりに、しかし私はそれがそれほど良いとは思わない。)

于 2012-11-10T16:40:11.510 に答える