質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

2回答

1284閲覧

Haskellの(x : xs)をしりたい

退会済みユーザー

退会済みユーザー

総合スコア0

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

0グッド

1クリップ

投稿2021/06/14 11:52

Haskellでappend[1,2,3][4,5]を入力すると[1,2,3,4,5]を出力するappend関数がよくわかりません。
(x : xs) ysでなにをやっているかわからないのでこちらのサイトを参考にしてtrace でデバッグしたいのですが
? No instance for (Show a) arising from a use of ‘show’
Possible fix:
add (Show a) to the context of
the type signature for:
append :: forall a. [a] -> [a] -> [a]
? In the first argument of ‘(++)’, namely ‘show x’
In the first argument of ‘trace’, namely
‘(show x ++ "" ++ show xs ++ "" ++ show ys)’
In the first argument of ‘($)’, namely
‘trace (show x ++ "" ++ show xs ++ "" ++ show ys)’
|
15 | trace (show x++""++show xs++""++show ys) $ --デバッグ
上記のエラーが吐かれます。
どのようにしたらappend (x : xs) ys =x : append xs ysを視覚化できるか教えてください

Haskell

1append :: [a] -> [a] -> [a] 2append [] ys = ys 3append (x : xs) ys = 4 trace (show x++""++show xs++""++show ys) $ --デバッグ 5 x : append xs ys 6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

とりあえず、型をこのように指定すれば通ります。

haskell

1append :: Show a => [a] -> [a] -> [a]

ただ、これだとトレース結果が見づらいので、こんな感じでどうでしょうか。

haskell

1append :: Show a => [a] -> [a] -> [a] 2append [] ys = ys 3append (x : xs) ys = 4 trace (show x++""++show xs++""++show ys) $ --デバッグ 5 let rs = append xs ys in rs `seq` x : rs

投稿2021/06/14 12:59

actorbug

総合スコア2429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/14 23:07

ありがとうございます
guest

0

ベストアンサー

結論からいうと、下記のように、引数の型a(厳密には、型変数aが表す型)にShow型クラスの制約を加えましょう:

haskell

1append :: Show a => [a] -> [a] -> [a] 2-- ... 以下省略 ...

エラーメッセージにおける

Possible fix:

add (Show a) to the context of
the type signature for:
append :: forall a. [a] -> [a] -> [a]

とは、まさにそのことを差しています。

Haskellにおいて型変数aで表される型というのは、Show a => ...と書いて型クラスの制約を明示しない限り、「あらゆる型の内一つ」という意味になります。「あらゆる型」の中にはShow型クラスのインスタンスでない、言い換えればshow関数で文字列に変換できない型もたくさんあります(例えばIO型)。
Show a =>のついてないappend :: [a] -> [a] -> [a]関数だと、そのようなshow関数が使えない型に対しても使用できなければならなくなるので、挙げたようなエラーが発生します。

投稿2021/06/14 12:49

igrep

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/14 23:07

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問