0

私は関数型プログラミングとCLEANの初心者です。私はいくつかの機能を持っていますが、そのうちの 1 つにエラーが発生し、その理由がわかりません。(CLEAN に非常に似ているため、Haskell でタグ付けしました。)

私のモジュール:

module Prac

combine :: (Maybe a) (Maybe [a]) -> Maybe [a]
combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just [x:xs]) = Just [d, x:xs]

sequence :: [Maybe a] -> Maybe [a]
sequence [Just x:xs] =  combine  (Just x)  Just[xs]

シーケンス定義で失敗します。

 Type error [Prac.icl,32,sequence]: near combine : cannot unify types:
 [v8] -> Maybe [v4]
 Maybe [v5]

どうもありがとう!!

4

1 に答える 1

5

これは Haskell で動作します:

combine :: Maybe a -> Maybe [a] -> Maybe [a]
combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just xs) = Just (d:xs)

sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence (a:xs) =  combine  a (sequence xs)

しかし、それがあなたが望むことをするかどうかはわかりません:

λ> sequence [Just 1, Just 3, Just 4]
Just [1,3,4]

λ> sequence [Just 1, Nothing, Just 4]
Nothing

λ> sequence []
Just []

わかりました、翻訳スキームを見つけました-しかし、今はそれを正しくテストする方法がないため、保証はありません

sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence [x:xs] =  combine x (sequence xs)

ただし、空のリストと署名についてはわかりません-申し訳ありません

とにかく、与えられたリストの頭を末尾の再帰的に計算されたシーケンスと組み合わせるという考えを再利用できれば、問題ないはずです

これはクリーンを使用して私にとってはうまくいきます

IDE をダウンロードし、プロジェクトを作成し、モジュールを 1 つ追加しました。

module seq

:: MayBe a = Just a | Nothing

Start = sequence [Just 3, Just 4, Just 5]

combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just xs) = Just [d:xs]

sequence [] = Just []
sequence [x:xs] =  combine x (sequence xs)

これをコンパイルし、プロジェクトを更新して実行しました-そして、ここでこれは機能します

于 2014-10-14T08:53:25.850 に答える