在我的计算机科学课上过去一两周,我们被问到如何通过"原则转换"简化和缩短功能.我们还没有收到有关这些作业的反馈,所以我不知道我是否做得对.
这是我最近的练习,以及我尝试解决方案:
Show by a series of principled transformations that we can define:
char :: Char -> Parser Char
char c = satisfy (c==)
as
char :: Char -> Parser Char
char = satisfy . (==)
Run Code Online (Sandbox Code Playgroud)
我的尝试:
char c = satisfy (c==)
=> char c = satisfy . c==
=> char c = satisfy . flip ==c
=> char = satisfy . flip ==
=> char = satisfy . (==)
Run Code Online (Sandbox Code Playgroud)
我可以得到一些反馈吗?为赋值提供的代码是不完整的,因此我无法编译它并测试以查看每个转换是否有效.我尝试编写一组类似的函数来自己测试转换,但遗憾的是我对Haskell非常不好,所以我也无法解决这个问题.
我正在研究Read ComplexInt的一个实例.
这是给出的:
data ComplexInt = ComplexInt Int Int
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
和
module Parser (Parser,parser,runParser,satisfy,char,string,many,many1,(+++)) where
import Data.Char
import Control.Monad
import Control.Monad.State
type Parser = StateT String []
runParser :: Parser a -> String -> [(a,String)]
runParser = runStateT
parser :: (String -> [(a,String)]) -> Parser a
parser = StateT
satisfy :: (Char -> Bool) -> Parser Char
satisfy f = parser $ \s -> case s of
[] -> []
a:as -> [(a,as) | f a]
char :: Char …Run Code Online (Sandbox Code Playgroud)