我不想粗鲁地问这个问题;然而,我最近一直试图学习Haskell,并希望了解该语言的最佳实践。我目前正在阅读一个库,该库解析Haskell文件,并将解析树作为json文档发布。的内容看起来是重复的,并试图为解析树的每个元素派生一个json生成器。在编写Haskell程序时,人们通常使用代码生成器吗?我会假设计算机生成的代码会打败函数式编程的优雅,或者我错了吗?是否有任何惯用的方法来简化下面的代码?
// ~80 lines of the same statements have been elided
instance ToJSON l => ToJSON (FunDep l) where
在Haskell中,在定义数据类型时,可以选择自动派生某些实例,但我是否可以推迟自动派生,甚至可以将其放到另一个库中?
下面是一个示例:
在Haskell中自动派生是一个实时保护程序!
module MoneyModule where
data Money = Money Int
deriving Show
现在我希望使用MoneyModule,但我也希望为Money提供一个Read实例
module ExternalModule where
instance Read Money where
read = error "Can't this be done aut
我正尝试在Haskell中为我创建的一个新数据类型添加一个实例声明,但没有成功。下面是我到目前为止尝试过的:
data Prediction = Prediction Int Int Int
showPrediction :: Prediction -> String
showPrediction (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c
instance Show (Prediction p) => showPrediction p
似乎最后一行是错的,但我不确定如何
为什么模板Haskell忽略引用中的独立派生声明?
{-# LANGUAGE TemplateHaskell, StandaloneDeriving #-}
data Test a = Test a
$([d| deriving instance Show a => Show (Test a); f x = x |])
ghci> :l Test.hs
[1 of 1] Compiling Main ( Test.hs, interpreted )
Ok, modules loaded: Main.
ghci> :t f
f :: t -> t
我确实有一个名为Jsonable的接口。
interface Jsonabe{
public function toJson();
}
而且我确实有两个实现接口的类。
class facebookTransformer implements Jsonable{
protected $facebookHandler;
public function __construct(){
$this->facebookHandler = new FacebookHandler();
}
public function toJson(){
}
}
第二类:
c
下列断言是正确的:
由Haskell类型系统验证的用户可编程访问的唯一真正的同构( Haskell编译器是/可以知道的)是:
- the **set** of values of a Haskell datatype
- the set of values of types those required by its constructors
即使是泛型编程也不能生成“真”同构,其组合在运行时以标识形式产生(例如 -和Ocaml中的 )。
Haskell本身是唯一产生的同构,Coercible,但是这些同构仅限于同构。
所谓“实同构,用户可编程访问,由Has
下面的代码对我不起作用。有谁能解释一下Haskell中如何解决和避免以下错误吗?
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
module Test where
import GHC.Generics
import Data.Aeson.Types
import Data.Aeson
data Person = Person { personId :: Int , personName :: String} deriving (Show, Generic)
instance ToJSON Perso
我有以下Haskell代码,它以JSON编码数据类型User的列表,并将其打印到标准输出:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Aeson
import Data.Text
import qualified Data.ByteString.Lazy.Char8 as B
data User = User
{ id :: String
, name :: String
, address :: String
} deriving (Show)
instance T
我正在用伊索做一些我正在做的客户端服务器的事情,把ADT编码成Json。我使用Data.Aeson.TH来生成我需要的toJSON实例,但是为Map类型生成的实例非常难看,很难处理。
我已经定义了我自己的、更简单的编码,它只是将它们作为列表来处理:
instance (ToJSON a, ToJSON b) => ToJSON (Map a b) where
toJSON m = toJSON $ toList m
当然,当我在我的代码中使用它时,我会得到一个Duplicate instance declarations错误。
有办法解决这个问题吗?我需要告诉模板Haskell不要为