8

The Little Schemerには、リストがフラットかどうかをチェックする関数があります。

(define lat?
  (lambda (l)
    (cond
     ((null? l) #t)
     ((atom? (car l)) (lat? (cdr l)))
     (else #f))))

Haskell で同じ再帰関数を書き込もうとしていますが、成功しません。

is_lat :: [a] -> Bool
is_lat [] = True
is_lat ???

パラメータがフォームにないことを確認するにはどうすればよい[[a]]ですか? つまり、[1,2,3]は有効な入力ですが、[[1,3], [2,4]]とはそうで[[[1,2,3]]]はありません。

リストを受け入れる再帰関数でこれをさらに使用して、フラットリストのみを確実に処理したいと考えています。

編集:is_lat :: [a] -> Bool型シグネチャのために人々が混乱しているようです。実行時に型をチェックするべきではないことに同意します。しかし、コンパイル時に型をチェックすることは可能ですか? 関数をフラットリストに対してのみ機能させるにはどうすればよいですか? それとも考え方を根本から変えるべきですか?

4

4 に答える 4

1

まあ、Haskell ではhttp://ideone.com/sPhRCPに制限されていると思います。

main = do   -- your code goes here
    print $isFlat [Node 1, Node 2, Node 3]
    print $isFlat [Node 1, Node 2, Branch [Node 3, Node 4, Node 5], Node 6]

data Tree a = Node a | Branch [Tree a]

isFlat :: [Tree a] -> Bool
isFlat = all isNode where
                      isNode (Node _) = True
                      isNode _ = False

厳密に型指定されていない言語では、すべてのオブジェクトが実行時の型情報を持っているため、ポリモーフィックになる可能性があります。これは、Scala のような強制の複雑なネットワーク (C++ を使用している場合はそれほど複雑ではありません) かもしれませんし、純粋に動的な言語 (Lisp、JS など) のように単に「すべてがオブジェクトであり、オブジェクトがすべて」である可能性もあります。 .
Haskell は厳密に型付けされています。

于 2013-09-05T07:31:16.990 に答える