1

私はHaskellにかなり慣れていないので、次の問題を解決する方法がわかりません。

リストと要素を取り、入力要素の後のリスト内の他のすべての要素を削除する次の関数「ca」を実装する必要があります。

ca:: Eq a => a -> [a] -> [a]

関数の型を変更することは許可されておらず、これまでのところ次のコードを思いつきました。

ca x xs = let (ys, zs) = splitAt (elemIndex x xs) xs in ys 

これにより、次のエラーが発生します。

couldn't match expected type 'Int' with the actual type 'Maybe Int'

このエラーが発生する理由はわかりましたが、修正方法はわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

1

関数は現在安全ではありませんが、これは型チェックする必要があります。

import Data.List
import Data.Maybe (fromJust)

ca x xs = let (ys, zs) = splitAt (fromJust $ elemIndex x xs) xs in ys

その理由は、elemIndex型が isであり、 outを抽出して関数に渡しelemIndex :: Eq a => a -> [a] -> Maybe Int たいからです。これが機能です。データ型から値を抽出します。IntMaybesplitAtfromJustfromJustJust

maybeまたは他の代替関数を使用して、この関数の安全な代替を作成してみることができます。

于 2014-04-15T12:19:55.487 に答える
0

あなたはこれを行うことができます:

let 
  Just n = elemIndex x xs
  (ys, zs) = splitAt n xs
in ys

ただし、指定された要素が存在しない場合は、「パターン マッチの失敗」により例外がスローされます。より良い方法はこれです:

case elemIndex x xs of
  Just n  -> let (ys, zs) = splitAt n xs in ys
  Nothing -> {- decide what to do if there's no match! -}

しかし、私は Hammar に同意します。リストを 2 つの部分に分割しようとしているわけではありません。あなたはそれらの部分の1つだけに興味があります。したがって、リストを調べて目的の要素を見つけ、そのインデックスを返し、リストをもう一度調べるのではなく、単に or を使用してみませんbreaktakeWhile?

于 2014-04-15T12:32:50.723 に答える