2009-06-09 13 views
8

はHaskellの関数は、それが必要何をしていないよう示しています。私は、関数を宣言するときが正しく改行に対処しない、を表示するようハスケル:ショーが台無しになった?

Prelude> let str = "stack\n\noverflow" 
Prelude> putStrLn str 
stack 


overflow 
Prelude> show str 
"\"Stack\\n\\n\\noverflow\"" 
Prelude> 

、私は通常タイプの署名を置きます。文字通り"\n"ではなく、改行として\nを扱いたい。型をStringに変更すると、関数はうまく動作します。

foo :: (Show x) => x -> IO() 
foo x = do 
    putStrLn $ show x 

を...とこのようにそれを呼び出す:しかし、私は、たとえばなど

など、山車、整数の別々の機能を実装する必要があり、私は、関数を宣言するだろう

予想される内容を返す機能はありますか?私。この関数はshowに似ていますが、改行を含む文字列を返すことはできますか?

+1

これは具体的なケースを教えてください。あなたの意図を理解しやすくなります。 – Martijn

+0

入力が文字列かどうかを確認するだけで、それを印刷することができます。パターンマッチングは非常に便利です。 – Rayne

+1

"show"はPythonでは 'repr()'と、以前はこれらの言語を使用していた場合はRubyで 'inspect'と似ています。 –

答えて

14

Haskellでのshowメソッドのコントラクトでは、評価されたときに表示された値が返される文字列が生成されます。あなたはToStringメソッドをシミュレートしようとしているようなあなたの用語の一部は少し混乱 ですが

Prelude> let str = "stack\n\noverflow" 
Prelude> putStrLn str 
stack 

overflow 
Prelude> putStrLn (show str) 
"stack\n\noverflow" 
Prelude> 
+2

あなたが記述した関数は実際には上記と同じように定義された "print"と呼ばれています print x = putStrLn(show x) – Phyx

3

showは、入力した方法で変数が表示されます。

かなり普通です。

9

は、サウンド。

あなたはこのようにそれをシミュレートすることができます。

{-# LANGUAGE UndecidableInstances, OverlappingInstances, 
      FlexibleInstances, TypeSynonymInstances #-} 

class ToString a where 
    toString :: a -> String 

instance ToString String where 
    toString = id 

instance Show a => ToString a where 
    toString = show 

LANGUAGEプラグマによって示されているようしかし、これは非常に望ましいものではありません。私たちがより多くの文脈を持っていれば、あなたがしようとしていることに対して実際に感じることがより簡単になるでしょう...

1

私はあなたの何をしようとしているのか分かりません。あなたが少し明確にするなら、それは助けになるでしょう。ショーはそれがしなければならないことをやっている。 Showは単にそれが表示された文字列を生成します。

1

ポルジーズの計画が働いていて、ghciで見つかった混乱している動作が、あなたが必要とするIO機能を持っていれば、引き続き表示されるので、showは本当に最高です。 CharのインスタンスをPorgesのコードに追加したのは、おそらく引用符を使わないようにするためです。

{-# LANGUAGE UndecidableInstances, OverlappingInstances, 
     FlexibleInstances, TypeSynonymInstances #-} 
class ToString a where 
    toString :: a -> String 

instance ToString String where 
    toString = id 

instance ToString Char where 
    toString x = [x] 

instance Show a => ToString a where 
    toString = show 

foo :: (ToString a) => a -> IO() 
foo x = do {putStrLn $ toString x} 

はその後、GHCiの中で、foo.showで何が起こるか見て:

*Main> let str = "stack\n\noverflow" 
*Main> show str 
"\"stack\\n\\noverflow\""  
*Main> putStrLn str 
stack 

overflow 
*Main> putStrLn (show str) 
"stack\n\noverflow" 
*Main> foo str 
stack 

overflow 
*Main> foo (show str) 
"stack\n\noverflow" 
*Main> foo (show (show str)) 
"\"stack\\n\\noverflow\"" 
*Main> let newl = "\n" 
*Main> foo newl 


*Main> putStrLn newl 


*Main> putStrLn (show newl) 
"\n" 



*Main> foo (show newl) 
"\n" 
*Main> foo (show (show newl)) 
"\"\\n\"" 
*Main> 
0

"showに似ていますが、改行を含む文字列を返すことができた機能?"

回答:id

+0

面白いか、あなたはちょっと質問をしましたか? – Jasper

+0

これはかなり古いですが、質問に答えてくれる 'putStrLn $ id" stack \ n \ noverflow "を意味するかもしれません。 – stites

関連する問題