使用该-Wall选项编译我的Haskell应用程序时,GHC会抱怨孤立的实例,例如:
Publisher.hs:45:9:
Warning: orphan instance: instance ToSElem Result
Run Code Online (Sandbox Code Playgroud)
类型类ToSElem不是我的,它由HStringTemplate定义.
现在我知道如何解决这个问题(将实例声明移动到声明Result的模块中),我知道为什么GHC更愿意避免孤立的实例,但我仍然相信我的方式更好.我不在乎编译器是否带来不便 - 而不是我.
我想ToSElem在Publisher模块中声明我的实例的原因是因为它是依赖于HStringTemplate的Publisher模块,而不是其他模块.我试图保持关注点的分离,并避免让每个模块依赖于HStringTemplate.
我认为,与Java的接口相比,Haskell类型类的优点之一是它们是开放的而不是封闭的,因此实例不必在与数据类型相同的位置声明.GHC的建议似乎是忽略了这一点.
所以,我正在寻找的是要么认可我的想法是正确的,要么我有理由忽视/压制这个警告,或者更有说服力的反对我做事的做法.
我试图了解结果
(*) . (+)
Run Code Online (Sandbox Code Playgroud)
在哈斯克尔.我知道合成算子只是数学函数的标准组成 - 所以
(f . g) = f (g x)
Run Code Online (Sandbox Code Playgroud)
但:
(*) . (+) :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)
我很难理解这种类型的签名.我希望能够做到这样的事情:
((*) . (+)) 1 2 :: Num a => a -> a
= (* (+ 1 2))
Run Code Online (Sandbox Code Playgroud)
的意义是什么 (*) .(+)的签名?我尝试用它来玩它(只是匹配它的签名):
((*) . (+)) 1 (\x -> x + 1) 1
Run Code Online (Sandbox Code Playgroud)
但那无法编译.我正在尝试在编写这些步骤时完成逻辑步骤,但我还没有完全理解它是如何得到这个结果的(以及结果是什么).
如何显式导入类型类实例?另外,如何使用合格的导入进行此操作?
目前,我正在做
import Control.Monad.Error ()
Run Code Online (Sandbox Code Playgroud)
导入我可以用于的monad实例(Either String).以前,我用过
import Control.Monad.Error
Run Code Online (Sandbox Code Playgroud)
我对其中任何一个都不满意,因为Monad实例是隐式导入的.
下面的代码使用不安全的GeneralizedNewtypeDeriving扩展来Data.Set通过插入具有不同Ord实例的不同元素来中断:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Set
import System.Random
class AlaInt i where
fromIntSet :: Set Integer -> Set i
toIntSet :: Set i -> Set Integer
instance AlaInt Integer where
fromIntSet = id
toIntSet = id
newtype I = I Integer deriving (Eq, Show, AlaInt)
instance Ord I where compare (I n1) (I n2) = compare n2 n1 -- sic!
insert' :: Integer -> Set Integer -> Set Integer
insert' n s = …Run Code Online (Sandbox Code Playgroud) 我希望能够使用二元运算符在haskell中组合数值函数.因此,例如,使用一元数字函数:
f*g
Run Code Online (Sandbox Code Playgroud)
应翻译为:
\x -> (f x)*(g x)
Run Code Online (Sandbox Code Playgroud)
并且类似地添加.让你自己的操作员这么做是非常简单的,但我真的很想让Num a => a -> a函数成为Num的一个实例,但我不知道该怎么做.
我也想使这个参数数量通用的,但可能是因为这是多么难以做到的元数泛型函数在Haskell太麻烦了,所以它可能只是更好地界定独立Num a => a -> a -> a,Num a => a -> a -> a -> a等...实例了一些数量相当大.
我正在读这本书:Haskell表达学派和第56页,在第5章的开头,我读到了术语"多态数据类型"和"多态类型".
这两个术语是指同一个概念吗?
他们是同义词吗?
或者这两者有什么区别?如果有,那是什么?
haskell ×6
typeclass ×2
ghc ×1
import ×1
pointfree ×1
security ×1
terminology ×1
type-safety ×1