gat*_*ado 7 haskell show typeclass
我想覆盖Haskell中的默认整数构造函数,因此它们产生字符串(主要是为了好奇,但暂时为LaTeX的\ frac {} {}带来不便的输入替代.
我希望能够使用语言本身,而不是使用特殊的解析器,但我想这可能不会成功...
module Main where
import Prelude hiding ((+))
newtype A = A Int deriving (Eq, Show, Num)
default (A)
(+) :: A -> (A -> String)
(A a) + (A b) = (show a) ++ " + " ++ (show b)
main2 = 3+4
main :: IO ()
main = putStrLn main2
Run Code Online (Sandbox Code Playgroud)
上面的问题是+函数只适用于(A,A)而不是(A,String)等.如果一个简单地省略模式匹配"(A a)"并写入"a"代替,那么show()函数以"A"为前缀,因此"3"变为"A 3"而不是"3".
我想覆盖Show for A,但它似乎很头疼......
Mtn*_*ark 14
如果你想要自己的Show
实例A
,那么就不要派生它并制作你自己的实例:
newtype A = A Int deriving (Eq, Num)
instance Show A where
show (A a) = show a
Run Code Online (Sandbox Code Playgroud)
然后你可以这样写:
(+) :: (Show a, Show b) => a -> b -> String
a + b = show a ++ " + " ++ show b
Run Code Online (Sandbox Code Playgroud)
当然,如果您正在定义自己的+
运算符,那么我认为您的问题不需要newtype A
声明:
module Main where
import Prelude hiding ((+))
(+) :: (Show a, Show b) => a -> b -> String
a + b = show a ++ " + " ++ show b
aSum = 3 + 4
main :: IO ()
main = putStrLn aSum
Run Code Online (Sandbox Code Playgroud)
覆盖Haskell中的默认整数构造函数,以便它们生成字符串
所以这是通过为String定义Num实例来完成的.然后(+)可以用作String - > String - > String.
一个超级简单的例子:
{-# LANGUAGE TypeSynonymInstances #-}
module A where
instance Num String where (+) = (++)
{-
*A> "hello" + "world"
"helloworld"
-}
Run Code Online (Sandbox Code Playgroud)
编写fromIntegral方法以从整数文字到字符串(例如1 - >"1")获取函数.
有关将Num值列表提升到Num的更通用,更有纪律的方法,请参阅Hinze方法,将流作为Num,http://hackage.haskell.org/package/hinze-streams
这是你想要做的吗?创建一个数字类型,以便您可以在Haskell中编写表达式,然后只打印它们并将它们作为LaTeX数学字符串出现?
module Main where
import Data.Ratio
data LaTeXmath = E Precedence String
deriving (Eq)
data Precedence = Pterm | Pmul | Padd | Pexp
deriving (Show, Eq, Ord, Bounded)
expr :: Precedence -> LaTeXmath -> String
expr p (E q s) | p >= q = s
| otherwise = "\\left(" ++ s ++ "\\right)"
instance Num LaTeXmath where
a + b = E Padd (expr Padd a ++ " + " ++ expr Padd b)
a - b = E Padd (expr Padd a ++ " - " ++ expr Padd b)
a * b = E Pmul (expr Pmul a ++ " " ++ expr Pmul b)
negate a = E Pterm (" -" ++ expr Pterm a)
abs a = E Pterm (" |" ++ expr Pexp a ++ "| ")
signum a = E Pterm (" \\signum (" ++ expr Pexp a ++ ") ")
fromInteger i = E Pterm (show i)
instance Fractional LaTeXmath where
a / b = E Pterm ("\\frac{" ++ expr Pexp a ++ "}{" ++ expr Pexp b ++ "}")
fromRational r = fromInteger num / fromInteger denom
where num = numerator r
denom = denominator r
instance Show LaTeXmath where
show a = "\\[" ++ expr Pexp a ++ "\\]"
sym :: String -> LaTeXmath
sym x = E Pterm x
anExample :: LaTeXmath
anExample = sym "y" / (recip 2 * ( 3 + sym "x" + 2 * sym "y" ) )
main :: IO ()
main = print anExample
Run Code Online (Sandbox Code Playgroud)
处理优先级所需的逻辑使得正确插入括号变得复杂.打印出的示例:
\[\frac{y}{\frac{1}{2} \left(3 + x + 2 y\right)}\]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8655 次 |
最近记录: |